Зарегистрируйте синглтон в модуле Prism 7.1, если он еще не зарегистрирован - PullRequest
0 голосов
/ 05 декабря 2018

В приложении My 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 singleton, но основное приложение НЕ знает об этом, я регистрирую его в MyModuleA : IModule, а также в MyModuleB : IModule:

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

Если я использую только плагин A или плагин B, всеработает нормально, но если я использую оба плагина, то синглтон IUsbStatus регистрируется дважды, и когда я его разрешаю, он НЕ дает мне один и тот же экземпляр объекта.

Как я могу это исправить?

1 Ответ

0 голосов
/ 05 декабря 2018

Вы должны проверить, регистрируется ли синглтон, прежде чем переопределять существующую регистрацию.Или вы должны убедиться, что ничего не решаете, пока все не зарегистрировано.

Последний вариант явно предпочтительнее, но его сложнее достичь, поэтому просто проверьте перед регистрацией UsbStatus.IContainerRegistry не может этого сделать, поэтому вы должны получить свой реальный контейнер и сделать некоторые вещи, относящиеся к контейнеру, например, для единицы:

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