【问题标题】:Multiple prism modules with same view name具有相同视图名称的多个棱镜模块
【发布时间】:2015-02-24 16:59:36
【问题描述】:

如何处理使用相同视图名称的多个模块?

作为参考,我使用的是Ninject,但这应该与Unity相同

如果我有 2 个模块,ModuleAModuleB,并且两个模块都有一个名为 ViewX 的视图,这将如何工作?我认为使用模块导航的重点是我可以做RegionManager.RequestNavigation("MainRegion", "ViewX") 并且 prism 将导航到包含该视图的任何模块。因为有 2 个,所以它会抓取第一个,但是 IoC 容器会炸毁,因为有 2 个名为 object 的注册名为 ViewX

我可以很容易地像ModuleA,ViewXModuleB,ViewX 这样注册,但这不是完全违背了目的吗?

有什么好的方法来处理这个问题?

【问题讨论】:

  • 哇,几分钟内有 2 票反对。如果你能解释原因,也许我可以删除这个问题。
  • 我不知道反对票从何而来;对我来说,这是一个很好的问题。
  • 我认为这是一个很好的问题,但您可能会被否决,因为什么是处理这个问题的好方法是主观的。
  • 好吧,如果它是主观的,那么有人可能会这么说,并给出最常见的 3 种方法或其他方式。感谢@dymanoid 这样做。

标签: c# wpf prism


【解决方案1】:

有多种方法可以解决您的问题。

您在问题中已经描述的第一个:只需使用包含模块名称的“完全限定”键注册您的视图对象。请注意,扩展方法 RequestNavigate(this IRegionManager regionManager, string regionName, string source) 接受 URI 字符串作为 source 参数,因此不会破坏范例:您提供视图的完整 URI。

另一种可能性是提供IServiceLocator 接口的自定义实现。您可以在您的引导程序中将其注册到您的 IoC 容器中。 Prism 实例化一个新视图,请求来自当前IServiceLocator:newRegionItem = this.serviceLocator.GetInstance<object>(candidateTargetContract) 的实例。例如,MEF 的 IServiceLocator 实现会在多个导出与请求的合同匹配时引发异常:

IEnumerable<Lazy<object, object>> exports = this.compositionContainer.GetExports(serviceType, null, key);
if ((exports != null) && (exports.Count() > 0))
{
    // If there is more than one value, this will throw an InvalidOperationException, 
    // which will be wrapped by the base class as an ActivationException.
    return exports.Single().Value;
}

您可以将此行为更改为您喜欢的任何内容,例如return exports.First().Value.

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2015-03-05
    相关资源
    最近更新 更多