最近我有机会创建一个新的基于棱镜的应用程序。我之前一直使用6.3版本,但看到prism 7已经不再是预发布状态,所以想试试。我使用Prism模板包创建了一个新的prism应用程序,一切都按预期工作。我像通常在6.3中那样更新了视图模型,传入Container以便解析某些对象,这些对象稍后会提供信息给视图。在6.3中,我会这样做:
public MainWindowViewModel(IRegionManager aRegionManager,
IUnityContainer aUnityContainer) : base()
现在在7.1.0.431版本中,我尝试做同样的事情,但更新了接口以适应新的IOC抽象。
public MainWindowViewModel(IRegionManager aRegionManager,
IContainerProvider aContainerProvider,
IContainerRegistry aContainerRegistry) : base()
这会从ViewModelLocator.AutoWireViewModel为IContainerX参数生成一个异常。
System.Exception {Unity.Exceptions.ResolutionFailedException}
{"Resolution of the dependency failed, type = 'Sample.ViewModels.MainWindowViewModel', name = '(none)'.\nException occurred while: while resolving.\nException is: InvalidOperationException - The current type, Prism.Ioc.IContainerProvider, is an interface and cannot be constructed. Are you missing a type
看起来好像我缺少了一个引用,但是我已经将该类型传递到应用程序的RegisterTypes调用中,所以所有的引用都应该被找到。在新的7.X版本中,我做错了什么吗?
编辑:根据@mnistic的建议
这里是从提供的App.xaml.cs模板包中传递IContainerRegistry的代码。
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//containerRegistry is a valid instance here
}
更新:
深入了解后,传递给 RegisterTypes 方法的 IContainerRegistry 列出了在调用该方法时可用的所有类型/接口。它已注册了一个 IUnityContainer 实例。当我创建项目时选择了 Unity 作为 IOC,但我可能错误地认为 IContainerRegistry 将客户端隐藏在实际实现之后。如果我将 ViewModel 构造函数更新为使用 IUnityContainer 对象,则可以正确解析。public MainWindowViewModel(IRegionManager aRegionManager,
IUnityContainer aContainerProvider) : base()
这是期望的行为吗?