Призма.Формы DI: Как избежать нескольких одноэлементных экземпляров?

#android #xamarin #xamarin.forms #prism

Вопрос:

Предположим, что у нас есть интерфейс IPushNotificationService, который реализован службой PushNotificationService и должен работать как одноэлементная служба внутри моей призмы.Приложение «Формы».

Как правильно зарегистрировать эту услугу в методе RegisterTypes, чтобы у нас всегда был один единственный экземпляр в данный момент?

Подход 1. Переопределите типы регистров и вызовите элемент RegisterSingleton.

 protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterSingleton<IPushNotificationService, PushNotificationService>();
}
 

Подход 2:
Переопределите типы регистраций и проверьте, зарегистрирована ли служба уже. Если да, он еще не присутствует в контейнере DI, вызовите RegisterSingleton.

 protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    if (!containerRegistry.IsRegistered<IPushNotificationService>())
    {
        containerRegistry.RegisterSingleton<IPushNotificationService, PushNotificationService>();
    }
}
 

Другой Подход? — Конечная цель состоит в том, чтобы иметь один экземпляр службы, зарегистрированной по одному элементу, в определенное время. Если я вернусь назад с помощью кнопки «Назад» в Xamarin Android, а затем перезапущу приложение, я получу несколько экземпляров службы, зарегистрированной одним пользователем. Как я могу этого избежать?

Комментарии:

1. При выполнении этого (кнопка «Назад» плюс перезапуск) во время отладки останавливается ли отладчик после кнопки «Назад»? Вы достигаете точки останова RegisterTypes один или два раза в процессе?

2. Отладчик не останавливается при нажатии кнопки «Назад». Однако приложение для Android запускается с SplashActivity —> MainActivity (оба режима запуска. singleTop), что означает, что у нас есть полный перезапуск приложения.

3. Как вы диагностируете множественные случаи? Является ли точка останова точкой двойного попадания? PushNotificationService

4. В типах регистрации я вызываю var registeredInstances = container.Resolve<IEnumerable<IPushNotificationService><IPushNotificationService>>(); которые возвращают все зарегистрированные экземпляры IPushNotificationService. Теперь, поскольку контейнер DI никогда не удаляется, он возвращает 1 экземпляр при каждом перезапуске приложения Xamarin.

5. Это хороший довод. Все эти контейнеры имеют несколько иное поведение при обработке регистрации, разрешений и утилизации одноэлементных сервисов. В большинстве приложений я использую Prism с DryIoc. В другом недавнем проекте мы используем не Prism, а SimpleInjector в качестве контейнера DI. Проблема всегда одна и та же. Я мог бы создать небольшой пример приложения. Похоже, что всплеск активности также оказывает некоторое влияние.