如果尚未注册,则在Prism 7.1模块中注册单例

时间:2018-12-05 13:36:16

标签: c# wpf mvvm unity-container prism

我的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 : IModuleMyModuleB : IModule中都注册了它:

public void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterSingleton<IUsbStatus, UsbStatus>();
}

如果我仅使用插件A或插件B,那么一切正常,但是如果我使用两个插件,那么IUsbStatus单例将注册两次,而在我解析它时,它不会给我相同的实例对象。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

在覆盖现有注册之前,您必须检查单例是否已经注册。或者,您必须确保在注册所有内容之前不解决任何问题。

后一个选项显然是可取的,但更难实现,因此只需在注册UsbStatus之前进行检查。 IContainerRegistry无法做到这一点,因此您必须获取实际的容器并执行一些特定于容器的操作,例如为了团结:

using Prism.Unity;
[...]
if (!containerRegistry.GetContainer().IsRegistered<IUsbStatus>())
    containerRegistry.RegisterSingleton<IUsbStatus, UsbStatus>();