棱镜的Unity IoC有可能从模块中获得所有通用接口

本文关键字:接口 Unity IoC 有可能 模块 棱镜 | 更新日期: 2023-09-27 18:23:36

也许标题不太清楚,或者我使用了错误的机制

想象一下这种情况

SOLUTION
|
|_ MODULE 1
   |_Factory1 (class) : IFactory (interface)
|
|_ MODULE 2
   |_Factory2 : IFactory
|
|_ SHELL
   |_List<IFactory>

我需要一种方法,让系统可以把从Shell(List)中的IFactory派生的所有类聚集在一起。有办法做到这一点吗?我不打算对每一类工厂都有一个超大的条件列表。

我的意思是,在某种程度上,类似于每个模块都注册了自己的工厂,因为Shell注册了所有这些。

棱镜的Unity IoC有可能从模块中获得所有通用接口

如果IModule的实现采用容器作为ctor参数,则可以在模块的Initialize()方法中注册每个模块的IFactory实现。

public class MyModule : IModule
{
  private readonly IUnityContainer container;
  public MyModule(IUnityContainer container)
  {
    this.container = container;
  }
  public void Initialize()
  {
    this.container.Register<IFactory, MyFactory>("MyFactory");
  }
}
public class Shell
{
  public Shell(IFactory[] factories)
  {
    // work with factories
  }
}

我认为模块是基础设施的一部分,而不是应用程序本身,所以我认为引用模块中的容器是可以接受的。尽管如此:如果你想离开Unity,你必须更改代码。

如果你不想以这种方式使用Modules,你可以看看TecX项目。它包含一个用于Unity的增强配置引擎,允许您对每个程序集的容器配置进行模块化,并从引导程序收集所有信息。