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

Multiple prism modules with same view name

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

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

相同

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

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

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

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

您在问题中已经描述的第一个:只需使用包含模块名称的 "full qualified" 键注册您的视图对象。请注意,扩展方法 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.