PRISM 7中如何获取适配Unity配置Configure方法的容器实例
解决Prism 7中Unity容器配置类型不匹配的问题
这个问题的核心是版本不兼容:Prism 7 默认使用的是新版 Unity 容器(命名空间 Unity),而你用来加载配置的 UnityConfigurationSection 属于旧版的 Microsoft.Practices.Unity.Configuration 包,它依赖的是旧版 Unity 容器(命名空间 Microsoft.Practices.Unity),两个版本的 IUnityContainer 是完全不同的类型,所以编译器会报转换错误。
下面是两种可行的解决办法,优先推荐第一种:
方案1:升级到新版Unity的配置体系(推荐)
新版 Unity(5.x 及以上)提供了自己的配置包,完全适配 Prism 7 使用的容器类型,步骤如下:
更新NuGet包
- 移除旧的
Microsoft.Practices.Unity和Microsoft.Practices.Unity.Configuration包 - 安装
Unity.Configuration(新版Unity的配置包)和Prism.Unity(确保是适配Prism 7的版本)
- 移除旧的
修改配置文件的命名空间
将原有配置节的 xmlns 替换为新版Unity的命名空间:<unity xmlns="http://schemas.unitycontainer.org/configuration"> <container> <register type="IProductInfo, Core.Interface" mapTo="Classes.ProductInfo, Core"> <constructor> <param name="Name" value="Product Name" /> <param name="Version" value="V1.2.65.30865" /> </constructor> </register> </container> </unity>修改代码加载配置
使用新版Unity的API来加载配置,此时containerRegistry.GetContainer()返回的Unity.IUnityContainer可以直接传入Configure方法:using Unity; using Unity.Configuration; using System.Configuration; public partial class App : PrismApplication { protected override void RegisterTypes(IContainerRegistry containerRegistry) { var unityContainer = containerRegistry.GetContainer(); var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var section = (UnityConfigurationSection)config.GetSection("unity"); section?.Configure(unityContainer); } }
方案2:强制使用旧版Unity容器(不推荐)
如果因为历史原因必须保留旧版的 Microsoft.Practices.Unity 栈,你需要让 Prism 7 使用旧版容器,但这会增加复杂度且容易引发版本冲突:
- 确保安装的
Prism.Unity版本是适配旧版Unity的(注意:Prism 7 大部分版本已经切换到新版Unity,可能需要找兼容旧版的特定版本) - 自定义容器扩展,将 Prism 的容器抽象映射到旧版
Microsoft.Practices.Unity.IUnityContainer
这种方式维护成本很高,除非有特殊需求,否则不建议采用。
内容的提问来源于stack exchange,提问作者Danila Kireev
相关产品推荐
相关产品推荐

