2013-09-04 2 views
0

Я пытаюсь повторно использовать регистрацию услуг в сборке, которую я использую несколькими службами в своем решении. Я следую примеру from the NServiceBus website для реализации решения. Следуя этому, если я не добавлю интерфейс IWantCustomInitialization, мой метод Init (и реализация контейнера IoC), похоже, не функционирует. Когда у меня реализован этот интерфейс, я получаю исключения (перечисленные в ответах на вопросы here и here). Я не могу заставить его работать, что исключений нет, и зависимости в моем MessageHandler заполняются должным образом. Вот моя текущая реализация EndpointConfig.Конфигурация NServiceBus с пользовательским контейнером

[EndpointSLA("00:00:30")] 
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, UsingTransport<Msmq>, INeedInitialization { 
    public void Init() { 
     Configure.With().ObjectBuilderAdapter(); 
    } 
} 
public class ObjectBuilderAdapter : IContainer { 
    readonly IDependencyInjector injector; 

    public ObjectBuilderAdapter(IDependencyInjectionBuilder dependencyInjectionBuilder) { 
     injector = dependencyInjectionBuilder.Create(); //This method does all the common service registrations that I am trying to re-use 
     //injector.RegisterType<ExtractIncomingPrincipal, PrincipalExtractor>(); 
    } 

    public void Dispose() { 
     injector.Dispose(); 
    } 

    public object Build(Type typeToBuild) { 
     return injector.Resolve(typeToBuild); 
    } 

    public IContainer BuildChildContainer() { 
     return new ObjectBuilderAdapter(new DependencyInjectorBuilder()); 
    } 

    public IEnumerable<object> BuildAll(Type typeToBuild) { 
     return injector.ResolveAll(typeToBuild); 
    } 

    public void Configure(Type component, DependencyLifecycle dependencyLifecycle) { 
     injector.RegisterType(component); 
    } 

    public void Configure<T>(Func<T> component, DependencyLifecycle dependencyLifecycle) { 
     injector.RegisterType(component); 
    } 

    public void ConfigureProperty(Type component, string property, object value) { 
     if (injector is AutofacDependencyInjector) { 
      ((AutofacDependencyInjector)injector).ConfigureProperty(component, property, value); 
     } else { 
      Debug.WriteLine("Configuring {0} for property {1} but we don't handle this scenario.", component.Name, property); 
     } 
    } 

    public void RegisterSingleton(Type lookupType, object instance) { 
     injector.RegisterInstance(lookupType, instance); 
    } 

    public bool HasComponent(Type componentType) { 
     return injector.IsRegistered(componentType); 
    } 

    public void Release(object instance) { } 
} 

общественного Extensions статического класса { общественности статической Настройки ObjectBuilderAdapter (это настройка конфигурации) { ConfigureCommon.With (конфигурации, новый ObjectBuilderAdapter (новый DependencyInjectorBuilder())); return config; } }

Примечание: Когда я использую интерфейс INeedInitialization, я получаю исключение ComponentNotRegisteredException, когда он ищет IStartableBus.

ответ

0

Когда вы пытаетесь заменить встроенный контейнер, вам необходимо реализовать IWantCustomInitialization в том же классе, который реализует IConfigureThisEndpoint.

Вы можете использовать свой собственный контейнер и зарегистрировать все свои типы там и указать NSB, чтобы использовать этот контейнер.

Например:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization 
{ 
    public void Init() 
    { 
     var container = new ContainerBuilder().Build(); 
     Configure.With() 
      .AutofacBuilder(container); 
    } 
} 
+0

Просто изменяя это IWantCustomInitialization resuls в ошибке было отмечено в этом так вопрос отвечал ранее. (http://stackoverflow.com/questions/18536774/nservicebus-fails-to-process-message-the-requested-service-nservicebus-imperso) – Flea

+0

Я добавил в реализацию ObjectBuilderAdapter выше, потому что, хотя ваше решение работает (используя встроенный AutofacBuilder), я не уверен, почему исключения происходят с использованием моего ObjectBuilderAdapter в соответствии с документацией здесь (http://support.nservicebus.com/customer/portal/articles/852357-containers). Должно быть что-то, что AutofacBuilder (и другие разработчики) делает для регистрации этих зависимостей. Мое подозрение в том, что существует базовый класс, который выполняет пару регистраций, которые мой класс мог бы извлечь из наследования. – Flea

+0

Я думаю, что корень этого заключается в том, что класс NServiceBus.ObjectBuilder.Autofac.AutofacObjectBuilder вызывает ContainerBuilder.Build() из AutoFac, который по умолчанию выполняет авторегистрацию на основе рефлексивной загрузки сборок. Я не делаю этого в своем решении, а, скорее, вручную регистрирует зависимости с AutoFac. – Flea