Я пытаюсь повторно использовать регистрацию услуг в сборке, которую я использую несколькими службами в своем решении. Я следую примеру 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.
Просто изменяя это IWantCustomInitialization resuls в ошибке было отмечено в этом так вопрос отвечал ранее. (http://stackoverflow.com/questions/18536774/nservicebus-fails-to-process-message-the-requested-service-nservicebus-imperso) – Flea
Я добавил в реализацию ObjectBuilderAdapter выше, потому что, хотя ваше решение работает (используя встроенный AutofacBuilder), я не уверен, почему исключения происходят с использованием моего ObjectBuilderAdapter в соответствии с документацией здесь (http://support.nservicebus.com/customer/portal/articles/852357-containers). Должно быть что-то, что AutofacBuilder (и другие разработчики) делает для регистрации этих зависимостей. Мое подозрение в том, что существует базовый класс, который выполняет пару регистраций, которые мой класс мог бы извлечь из наследования. – Flea
Я думаю, что корень этого заключается в том, что класс NServiceBus.ObjectBuilder.Autofac.AutofacObjectBuilder вызывает ContainerBuilder.Build() из AutoFac, который по умолчанию выполняет авторегистрацию на основе рефлексивной загрузки сборок. Я не делаю этого в своем решении, а, скорее, вручную регистрирует зависимости с AutoFac. – Flea