Membus和简单注入器-按接口自动连接命令处理程序

本文关键字:连接 命令处理程序 接口 简单 注入器 Membus | 更新日期: 2023-09-27 18:10:05

我在Membus中看到了IoC功能,我试图连接到简单注入器

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结合起来的最佳方式是什么?

脚注

我还见过其他按约定连接菜单的方法:

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容器来处理生命周期范围,并避免实例化命令处理程序并在需要它们之前手动连接它们。

Membus和简单注入器-按接口自动连接命令处理程序

您可以有多个注册。下面是一个例子(抱歉,我的电脑今天坏了,我在记事本上写这个):

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方法的这些版本

我使用这种技术来支持发布/订阅框架。您可以设置n个数独立的 CommandHandler