Membus и Simple Injector - Проводные команды обработчики автоматически по интерфейсу
Я видел функцию IoC в Membus, которую я пытался подключить к Simple Injector
IEnumerable<object> IocAdapter.GetAllInstances(Type desiredType)
{
var found = SimpleInjectorContainer.GetAllInstances(desiredType);
return found;
}
Идея состоит в том, что я буду автоматически регистрировать все свои типы с RegisterManyForOpenGeneric(typeof<CommandHandler<>),typeof<CommandHandler<>).Assembly)
,
Нет сомнений, что, как правило, по уважительной причине SimpleInjector не допускает многократную регистрацию, однако я хочу сделать это для того, чтобы разные аспекты обработки команд были реализованы разными обработчиками.
public void MembusBootstrap()
{
this.Bus = BusSetup.StartWith<Conservative>()
.Apply <IoCSupport>(c =>
{
c.SetAdapter(SimpleInjectorWiring.Instance)
.SetHandlerInterface(typeof(HandleCommand<>));
})
.Construct();
}
public void SimpleInjectorBootstrap()
{
this.Container.Register<HandleCommand<AccountCreatedCommand>,
SetupNewAccountCommandHandler();
// next line will throw
this.Container.Register<HandleCommand<AccountCreatedCommand>,
LogNewAccountRequestToFile>();
}
Конечно IEnumerable<object> IocAdapter.GetAllInstances(Type desiredType)
интерфейс от membus ожидает коллекцию, поэтому можно вызывать несколько обработчиков.
Какой лучший способ выйти замуж за Membus с SimpleInjector IoC?
сноска
Я видел другие способы подключения menbus по соглашению:
public interface YetAnotherHandler<in T> {
void Handle(T msg);
}
public class CustomerHandling : YetAnotherHandler<CustomerCreated>
...
var b = BusSetup
.StartWith<Conservative>()
.Apply<FlexibleSubscribeAdapter>(c => c.ByInterface(typeof(YetAnotherHandler<>))
.Construct();
var d = bus.Subscribe(new CustomerHandling());
Но мне бы очень хотелось придерживаться контейнера IoC для обработки области действия на весь срок службы, а также во избежание создания экземпляров обработчиков команд и их ручного подключения до того, как они потребуются.
2 ответа
Вы можете иметь несколько регистраций. Вот пример (извинения, но мой компьютер сегодня умер, и я пишу это в блокноте):
SimpleInjectorContainer.RegisterManyForOpenGeneric(typeof(CommandHandler<>),
AccessibilityOption.PublicTypesOnly,
(serviceType, implTypes) => container.RegisterAll(serviceType, implTypes),
AppDomain.CurrentDomain.GetAssemblies()
);
и их можно получить с помощью:
public IEnumerable<CommandHandler<T>> GetHandlers<T>()
where T : class
{
return SimpleInjectorContainer.GetAllInstances<CommandHandler<T>>();
}
вы найдете эти версии RegisterManyForOpenGeneric
а также GetAllInstances
методы, описанные здесь
Я использую эту технику для поддержки инфраструктуры публикации / подписки. Вы можете иметь n число независимых CommandHandler
"s
В качестве дополнительной информации в этом блоге (отказ от ответственности - мой сайт) рассказывается о том, как в эти дни вы подключаете MemBus к DI-контейнеру.