在两个程序集之间共享全局Unity容器,而不传递引用

本文关键字:容器 Unity 引用 全局 共享 两个 之间 程序集 | 更新日期: 2023-09-27 18:28:39

我有两个程序集:

  • SERVICE—具有存储库接口
  • DB—具有存储库实现

引用方向是从DB到SERVICE(DB引用SERVICE)。

SERVICE程序集创建一个Unity容器。它将在运行时动态加载DB程序集(以加载实现)。

现在我需要在DB程序集中注册存储库对象,但我找不到任何方法来检索DB程序集中已经创建的Unity容器(而不是创建一个具有不同上下文的新容器)。

问题是(可能的解决方案):有没有任何方法可以获得当前AppDomain中已经创建的容器的列表(在asms之间共享)

我不想使用查找(发现),像这样:

container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
  WithMappings.FromMatchingInterface,
  WithName.Default);

因为我希望我的绑定是明确的。

在两个程序集之间共享全局Unity容器,而不传递引用

您真的不应该在任何SERVICEDB类库中使用(甚至引用)DI容器。唯一应该使用容器的地方是Composition Root。

组合根是应用程序中的入口点。在您的情况下,它是Console应用程序的main方法。在这里,您可以通过向容器注册类型并解析对象(通常是单个根对象)来从所有类库中组成类。

你的类库不应该有CompositionRoots。只有应用程序具有复合根。这允许其他应用程序在使用不同的DI容器时使用这些类库,甚至不使用任何(称为Pure DI)。

回答我自己的问题,但。。。我发现Unity没有这样的特性。

可能的解决方案:

  • 如果程序集是静态引用的,则必须通过引用容器来调用引导方法,例如UnityConfig.Register(container)
  • 如果在没有任何静态引用的情况下动态加载程序集(插件)。调用问题本身中提供的代码,即:

container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
  WithMappings.FromMatchingInterface,
  WithName.Default);