具有相同视图名称的多个棱镜模块
Multiple prism modules with same view name
如何处理使用相同视图名称的多个模块?
作为参考,我使用的是 Ninject
,但这应该与 Unity
相同
如果我有 2 个模块,ModuleA
和 ModuleB
,并且两个模块都有一个名为 ViewX
的视图,这将如何工作?我认为使用模块导航的意义在于我可以执行 RegionManager.RequestNavigation("MainRegion", "ViewX")
并且 prism 将导航到包含该视图的任何模块。因为有 2 个,它会抓住第一个,但是 IoC 容器会爆炸,因为有 2 个 object
的注册名为 ViewX
.
我可以很容易地像ModuleA,ViewX
、ModuleB,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
.
如何处理使用相同视图名称的多个模块?
作为参考,我使用的是 Ninject
,但这应该与 Unity
如果我有 2 个模块,ModuleA
和 ModuleB
,并且两个模块都有一个名为 ViewX
的视图,这将如何工作?我认为使用模块导航的意义在于我可以执行 RegionManager.RequestNavigation("MainRegion", "ViewX")
并且 prism 将导航到包含该视图的任何模块。因为有 2 个,它会抓住第一个,但是 IoC 容器会爆炸,因为有 2 个 object
的注册名为 ViewX
.
我可以很容易地像ModuleA,ViewX
、ModuleB,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
.