我有两个程序集:
- SERVICE—具有存储库接口
- DB—具有存储库实现
引用方向是从DB到SERVICE(DB引用SERVICE)。
SERVICE程序集创建一个Unity容器。它将在运行时动态加载DB程序集(以加载实现)。
现在我需要在DB程序集中注册存储库对象,但我找不到任何方法来检索DB程序集中已经创建的Unity容器(而不是创建一个具有不同上下文的新容器)。
问题是(可能的解决方案):有没有任何方法可以获得当前AppDomain中已经创建的容器的列表(在asms之间共享)
我不想使用查找(发现),像这样:
container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
WithMappings.FromMatchingInterface,
WithName.Default);
因为我希望我的绑定是明确的。
您真的不应该在任何SERVICE
或DB
类库中使用(甚至引用)DI容器。唯一应该使用容器的地方是Composition Root。
组合根是应用程序中的入口点。在您的情况下,它是Console应用程序的main
方法。在这里,您可以通过向容器注册类型并解析对象(通常是单个根对象)来从所有类库中组成类。
你的类库不应该有CompositionRoots。只有应用程序具有复合根。这允许其他应用程序在使用不同的DI容器时使用这些类库,甚至不使用任何(称为Pure DI)。
回答我自己的问题,但。。。我发现Unity没有这样的特性。
可能的解决方案:
- 如果程序集是静态引用的,则必须通过引用容器来调用引导方法,例如UnityConfig.Register(container)
- 如果在没有任何静态引用的情况下动态加载程序集(插件)。调用问题本身中提供的代码,即:
container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
WithMappings.FromMatchingInterface,
WithName.Default);