c# - 如果尚未注册,请在 Prism 7.1 模块中注册单例

标签 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 : 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/

相关文章:

c# - 从使用 Excel-DNA 构建的 Excel .XLL 文件中解压内容

.net - CollectionViewSources 可以嵌套吗?

.net - 如何在wpf文本框中自动化数字格式

c# - 如何在WPF文本 block 验证错误上显示消息框

android - PreferencesFragment 和 MVVM 架构

c# - 如何将返回 `Either` 的方法绑定(bind)到 Language-Ext 中接受 `Option` 的方法?

c# - 在 C# 中解压缩 BIG .tar.gz 的最快方法?

c# - 如何绑定(bind)到父集合 MVVM WPF 中的特定项目

c# - wpf如何控制 Storyboard

c# - 挂接到 WPF 窗口中的 Windows 消息循环会在内部添加白色边框