wpf - Prism 在范围或多个容器内具有寄存器类型
问题描述
我们在我们的应用程序中使用 wpf 和 prism。我们的 App 类继承自 PrismApplication,它有一个 DI 容器,一个名为 Container 的属性。
我们希望能够在范围内注册类型或拥有多个容器。有效的目标是在特定范围内注册类型。
这篇文章,似乎有一个类似的目标(不一样,因为他们想按模块削减它),但我看不到你可以在应用程序中的哪里设置这个 NewContainer(见链接,答案 1)。Container-property 是只读的。
生病试图保持这篇文章/问题简短。如果不清楚,请告诉我。
解决方案
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
,IContainerRegistry
和IContainerProvider
接口,而无需将底层容器暴露IUnityContainer
给您的模块。您只需要它来创建带有CreateChildContainer
. 为了能够访问它,您始终可以通过GetContainer
onIContainerExtension
和扩展方法获取底层容器IContainerProvider
。
如果您不想为模块创建子容器,而是为范围创建子容器,则可以通过在应用程序类中实例化子容器并在字典中为它们分配名称来修改示例。然后,您可以使用您在需要的地方注入IScopedContainerProvider
的方法创建提供程序。GetContainer(string scope)
如果专用范围很少,您还可以创建单独的容器接口,例如IDatabaseContainer
或IBusinessContainer
直接访问相应的范围容器。
推荐阅读
- centos7 - 如何从 CLI 检查 MOBO 是否支持 WOL?
- react-native - 将本机帖子反应到快递服务器时可能出现未处理的承诺拒绝
- batch-file - 如何使用批处理读取从串口接收到的数据?
- c++ - 从文件 C++ 中删除一行
- django - 找不到 Django 项目页面
- jquery - 使用多选下拉菜单进行多选过滤 - jQuery
- sql - 在 VBA 中运行时 SQL 查询未显示所有结果
- javascript - 用户关闭网页时如何删除链接颜色的本地存储
- sql - 尝试使用 LAG 计算行之间的百分比变化
- laravel - 如何使用foreach循环在laravel控制器返回值中按姓氏排序