具有相同视图名称的多个棱镜模块

时间:2015-02-23 20:48:10

标签: c# wpf prism

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

供参考,我使用Ninject,但这与Unity

相同

如果我有2个模块,ModuleAModuleB,并且两个模块都有一个名为ViewX的视图,那么它将如何工作?我认为使用模块导航的关键是我可以RegionManager.RequestNavigation("MainRegion", "ViewX")并且棱镜将导航到包含该视图的任何模块。由于有2个,它会抓住第一个,但IoC容器会爆炸,因为object有两个名为ViewX的注册。

我可以轻松地进行ModuleA,ViewXModuleB,ViewX之类的注册,但是并没有完全违背目的吗?

处理此问题的好方法是什么?

1 个答案:

答案 0 :(得分:2)

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

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

另一种可能性是提供IServiceLocator接口的自定义实现。您可以在引导程序的IoC容器中注册它。 Prism实例化一个新视图,请求当前IServiceLocatornewRegionItem = 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