0

У меня возникли проблемы с получением экземпляра IBus в фильтре действий (атрибуте).ASP.NET MVC4 NServiceBus Attribute/Filter StructureMap

От Setting IBus Property in MVC Filter, я знаю, что фильтры DI и действий не играют хорошо, и я заставил их играть хорошо, используя принятый ответ. Проблема в том, что получение DI и фильтров действий для воспроизведения приятных разрывов NServiceBus.

В том же вопросе было предложено Джоном посмотреть решение для видео-магазина, чтобы посмотреть, как это сделать. Есть две проблемы с этим ответом:

  1. Он полностью игнорирует тот факт, что я использую StructureMap.
  2. Что еще более важно, используя этот образец, когда я добавил свой собственный полученный фильтр полномочий (см. Ниже), экземпляр IBus по-прежнему не заполняется.

Это предположение с моей стороны, но я не думаю, что запеченный в контейнере DI, который NServiceBus может обрабатывать DI в фильтр действий.

//NOTE: 
//I added a Filters folder to the project, and stuck this class in there 
//This filter will disable authentication when debugging 
//Add the attribute to the home controller, and 
//If you put a break point at the beginning, IBus doesn't get filled 

using NServiceBus; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace VideoStore.ECommerce.Filters 
{ 
    public class AMSAuthorizeAttribute : AuthorizeAttribute 
    { 
     public IBus Bus { get; set; } 
     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      bool accessGranted = false; 

      accessGranted = base.AuthorizeCore(httpContext); 

      //if(isAdmin) 
      // accessGranted = true; 

#if DEBUG 
      accessGranted = true; 
#endif 

      return accessGranted; 
     } 
    } 
} 

Когда я следуйте инструкциям, указанным в Setting IBus Property in MVC Filter, я получаю эту ошибку StructureMap Exception Code: 202 No Default Instance defined for PluginFamily NServiceBus.Unicast.Subscriptions.ISubscriptionStorage, NServiceBus.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=9fc386479f8a226c

+0

Вы сказали NServiceBus использовать StructureMap в качестве внутреннего контейнера? См. Http://support.nservicebus.com/customer/portal/articles/852357 –

+0

Да, все работает нормально, пока я не пытаюсь использовать NServiceBus в фильтре. Я могу заставить NServiceBus работать с StructureMap, и я могу заставить StructureMap выполнять функцию Injection в фильтре, но попытка заставить StructureMap вводить NServiceBus в фильтр действий не работает. –

+0

Извините, не знаю! –

ответ

0

Поскольку атрибуты фильтра не играть хорошо с инъекцией зависимостей, вы можете обнаружить, что проще всего сделать это в фильтре:

private readonly IBus bus = Configure.Instance.Builder.Build<IBus>(); 
+0

не требовал бы, чтобы у меня была ссылка на структурную карту или контейнер DI по выбору в каждом из определений фильтра? –

+0

Не следует. NServiceBus будет использовать StructureMap (или независимо от того, что вы настраиваете) внутренне, но вы можете получить ссылку на singleton IBus через NServiceBus API независимо от того, как он был построен. –

+0

О, я думал, что Configure - это пространство имен StructureMap. Я попробую это завтра и посмотрю, как это работает. Существуют ли какие-либо недостатки в построении IBus? –