如何处理使用相同视图名称的多个模块?
供参考,我使用Ninject
,但这与Unity
如果我有2个模块,ModuleA
和ModuleB
,并且两个模块都有一个名为ViewX
的视图,那么它将如何工作?我认为使用模块导航的关键是我可以RegionManager.RequestNavigation("MainRegion", "ViewX")
并且棱镜将导航到包含该视图的任何模块。由于有2个,它会抓住第一个,但IoC容器会爆炸,因为object
有两个名为ViewX
的注册。
我可以轻松地进行ModuleA,ViewX
,ModuleB,ViewX
之类的注册,但是并没有完全违背目的吗?
处理此问题的好方法是什么?
答案 0 :(得分:2)
有多种方法可以解决您的问题。
您在问题中已经描述的第一个:只需使用包含模块名称的“完全限定”键注册视图对象。请注意,扩展方法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
。