Prism 在范围或多个容器内具有寄存器类型

Prism have register type within scopes or multiple containers

我们在应用程序中使用了 wpf 和 prism。我们的 App-class 继承自 PrismApplication,它有一个 DI-container,一个 属性 命名的 Container.

我们希望能够在范围内注册类型或拥有多个容器。有效的目标是在特定范围内注册类型。

,似乎有一个相似的目标(不一样,因为他们想按模块削减它),但我看不到你可以在应用程序中的什么地方设置这个 NewContainer(见 link,答案1)。 Container-属性 是只读的。

我会尽量让这个 post/question 简短。不清楚的请告诉我。

在 Prism >=7 中,您可以通过覆盖 CreateContainerExtension 方法来替换应用程序基础 class 中派生自 PrismApplication 的默认容器。

public partial class App : PrismApplication
{
    protected override IContainerExtension CreateContainerExtension()
    {
        return new MyContainerExtension();
    }

    // ...your application code
}

您的自定义容器实现应派生自 IContainerExtension<TContainer>。您可以在 Prism Documentation 中找到关于此的更详细描述。虽然它适用于 Xamarin,但它在 WPF 中的工作方式相同。

如您链接的答案中所述,没有将不同容器传递给模块或确定它们范围的内置方法,但提供的解决方案正是您可以实现此目的的方法。但是,如果您以上述方式注册容器,则可以继续使用 IContainerExtensionIContainerRegistryIContainerProvider 接口,而无需使用例如公开底层容器。 IUnityContainer 到您的模块。您只需要它来创建 CreateChildContainer 的子容器。为了能够访问它,您始终可以在 IContainerExtensionIContainerProvider.

上使用扩展方法 GetContainer 获取底层容器

如果您不想为模块创建子容器,而是为范围创建子容器,您可以通过在应用程序中实例化子容器来修改示例 class 并在字典中为它们分配名称。然后,您可以使用方法 GetContainer(string scope) 创建一个提供程序 IScopedContainerProvider,然后将其注入到需要的地方。如果专门作用域很少,您还可以创建单独的容器接口,如 IDatabaseContainerIBusinessContainer 直接访问相应作用域容器。