首页 > 解决方案 > Prism 在范围或多个容器内具有寄存器类型

问题描述

我们在我们的应用程序中使用 wpf 和 prism。我们的 App 类继承自 PrismApplication,它有一个 DI 容器,一个名为 Container 的属性。

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

这篇文章,似乎有一个类似的目标(不一样,因为他们想按模块削减它),但我看不到你可以在应用程序中的哪里设置这个 NewContainer(见链接,答案 1)。Container-property 是只读的。

生病试图保持这篇文章/问题简短。如果不清楚,请告诉我。

标签: wpfdependency-injectionprism

解决方案


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

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

    // ...your application code
}

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

正如您在链接的答案中所述,没有将不同容器传递给模块或确定它们范围的内置方法,但提供的解决方案正是您可以实现这一目标的方法。但是,如果您以上述方式注册容器,则可以继续使用IContainerExtension,IContainerRegistryIContainerProvider接口,而无需将底层容器暴露IUnityContainer给您的模块。您只需要它来创建带有CreateChildContainer. 为了能够访问它,您始终可以通过GetContaineronIContainerExtension和扩展方法获取底层容器IContainerProvider

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


推荐阅读