【发布时间】:2013-03-20 18:08:14
【问题描述】:
我有一个非常基本的 prism 应用程序,我正在尝试将其用作大型项目的开始。我有一个外壳,其中定义了一个名为“MainContent”的区域。项目中有3个模块。一个 MainMenuModule、一个 MovieModule 和一个 TVModule。 Movie 和 TV 模块依赖于 MainMenuModule。使用 DirectoryModuleCatalog 加载模块。包含 TVModule 时会出现此问题,更具体地说,当调用 TVModule 的构造函数时会引发异常。下面的构造函数会报错:
public TVModule(IUnityContainer container, IRegionManager manager)
{
_container = container;
_manager = manager;
}
如果我将构造函数更改为以下内容,则不会出现异常,并且 TVModule 会按预期加载。
public TVModule(IRegionManager manager)
{
_manager = manager;
}
当 Unity 尝试解析 IUnityContainer 时抛出我得到的异常。真正让我感到困惑的是,MovieModule 的构造器与 TVModule 的构造器完全相同,但可以毫无问题地工作。异常详情。
{"解析依赖失败,type = \"TVModule.TVModule\", name = \"(none)\"。 异常发生时:解决时。 异常是: InvalidOperationException - 当前类型 Microsoft.Practices.Unity.IUnityContainer 是一个接口,无法构造。您是否缺少类型映射? 在异常发生时,容器是:
正在解析 TVModule.TVModule,(无) 解析构造函数 TVModule.TVModule 的参数“容器”(Microsoft.Practices.Unity.IUnityContainer 容器,Microsoft.Practices.Prism.Regions.IRegionManager 管理器) 解决 Microsoft.Practices.Unity.IUnityContainer,(无) "}
{"当前的类型,Microsoft.Practices.Unity.IUnityContainer,是一个接口,不能构造。你是不是缺少类型映射?"}
编辑:我已将我的源代码的副本上传到保管箱here
【问题讨论】:
-
您是否将两个模块都注册到
UnityContainer?与TVModule相比,MovieModule的设置/注册方式有何不同? -
除了 MovieModule 有一个 TVModule 没有的额外视图之外,实际上并没有什么不同。随意从我添加到问题中的 Dropbox 链接下载我的源代码。
-
这不是一个答案,而是一个好建议:您应该避免以显式方式在类之间传递 ioc 容器。它是支持解析服务的容器,但容器本身不是业务服务。传递一个容器会使你的类依赖于容器,这是不好的——ioc 应该帮助你而不是破坏你的代码。
-
所以当我需要注册类型时,我应该使用 ServiceLocator.Current.GetInstance
() 而不是将容器传递给构造函数?
标签: c# wpf prism unity-container