我的Prism 7.1应用程序使用2个模块,例如插件。
App : PrismApplication
注册了一个IDataService
单例,该单例始终可用
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IDataService, DataService>();
}
,两个插件都可以使用它
public void OnInitialized(IContainerProvider containerProvider)
{
_dataService = containerProvider.Resolve<IDataService>();
}
没关系-两个模块都获得对象的相同实例。
但是:
两个插件中的每个插件也都需要使用IUsbStatus
单例,但是主应用程序对此一无所知,我在MyModuleA : IModule
和MyModuleB : IModule
中都注册了它:>
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IUsbStatus, UsbStatus>();
}
如果我仅使用插件A或插件B,那么一切正常,但是如果我使用两个插件,那么IUsbStatus
单例将注册两次,而在我解析它时,它不会给我相同的实例对象。
我该如何解决?
答案 0 :(得分:1)
在覆盖现有注册之前,您必须检查单例是否已经注册。或者,您必须确保在注册所有内容之前不解决任何问题。
后一个选项显然是可取的,但更难实现,因此只需在注册UsbStatus
之前进行检查。 IContainerRegistry
无法做到这一点,因此您必须获取实际的容器并执行一些特定于容器的操作,例如为了团结:
using Prism.Unity;
[...]
if (!containerRegistry.GetContainer().IsRegistered<IUsbStatus>())
containerRegistry.RegisterSingleton<IUsbStatus, UsbStatus>();