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-контейнеру.

Другие вопросы по тегам