我的 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
单例注册了两次,当我解决它时,它没有给我相同的对象实例。我怎样才能解决这个问题?
最佳答案
在覆盖现有注册之前,您必须检查单例是否已经注册。或者您必须确保在注册所有内容之前不解决任何问题。
后一个选项显然更可取,但更难实现,因此只需在注册 UsbStatus
之前进行检查。 . IContainerRegistry
不能这样做,所以你必须得到你的实际容器并做一些容器特定的东西,例如为了统一:
using Prism.Unity;
[...]
if (!containerRegistry.GetContainer().IsRegistered<IUsbStatus>())
containerRegistry.RegisterSingleton<IUsbStatus, UsbStatus>();
关于c# - 如果尚未注册,请在 Prism 7.1 模块中注册单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53633606/