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 中的工作方式相同。
如您链接的答案中所述,没有将不同容器传递给模块或确定它们范围的内置方法,但提供的解决方案正是您可以实现此目的的方法。但是,如果您以上述方式注册容器,则可以继续使用 IContainerExtension
、IContainerRegistry
和 IContainerProvider
接口,而无需使用例如公开底层容器。 IUnityContainer
到您的模块。您只需要它来创建 CreateChildContainer
的子容器。为了能够访问它,您始终可以在 IContainerExtension
和 IContainerProvider
.
上使用扩展方法 GetContainer
获取底层容器
如果您不想为模块创建子容器,而是为范围创建子容器,您可以通过在应用程序中实例化子容器来修改示例 class 并在字典中为它们分配名称。然后,您可以使用方法 GetContainer(string scope)
创建一个提供程序 IScopedContainerProvider
,然后将其注入到需要的地方。如果专门作用域很少,您还可以创建单独的容器接口,如 IDatabaseContainer
或 IBusinessContainer
直接访问相应作用域容器。
我们在应用程序中使用了 wpf 和 prism。我们的 App-class 继承自 PrismApplication,它有一个 DI-container,一个 属性 命名的 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 中的工作方式相同。
如您链接的答案中所述,没有将不同容器传递给模块或确定它们范围的内置方法,但提供的解决方案正是您可以实现此目的的方法。但是,如果您以上述方式注册容器,则可以继续使用 IContainerExtension
、IContainerRegistry
和 IContainerProvider
接口,而无需使用例如公开底层容器。 IUnityContainer
到您的模块。您只需要它来创建 CreateChildContainer
的子容器。为了能够访问它,您始终可以在 IContainerExtension
和 IContainerProvider
.
GetContainer
获取底层容器
如果您不想为模块创建子容器,而是为范围创建子容器,您可以通过在应用程序中实例化子容器来修改示例 class 并在字典中为它们分配名称。然后,您可以使用方法 GetContainer(string scope)
创建一个提供程序 IScopedContainerProvider
,然后将其注入到需要的地方。如果专门作用域很少,您还可以创建单独的容器接口,如 IDatabaseContainer
或 IBusinessContainer
直接访问相应作用域容器。