Membus和Simple Injector - 通过接口自动接线命令处理程序

时间:2013-04-20 18:17:46

标签: c# simple-injector message-bus membus

我已经看到Membus中的IoC功能,我试图连接到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>();
}

当然,来自membus的IEnumerable<object> IocAdapter.GetAllInstances(Type desiredType)接口期望一个集合,因此可以调用多个处理程序。

将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 个答案:

答案 0 :(得分:2)

您可以进行多次注册。这是一个例子(道歉,但我的PC今天死了,我在记事本中写这个):

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>>();
}

您会发现RegisterManyForOpenGenericGetAllInstances方法的这些版本here

我使用这种技术来支持发布/订阅框架。您可以 n 编号独立 CommandHandler

答案 1 :(得分:1)

作为附加信息,this blog post here(免责声明 - 我的网站)概述了如何将MemBus连接到DI容器的方式。