【问题标题】:WPF Prism Module error resolving IUnityContainerWPF Prism 模块错误解决 IUnityContainer
【发布时间】: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


【解决方案1】:

根据 Wiktor 的建议,我已删除将 Unity 容器传递给模块的构造函数。我现在使用服务定位器在需要时访问容器。

ServiceLocator.Current.GetInstance<IUnityContainer>();

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多