#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. Проблема всегда одна и та же. Я мог бы создать небольшой пример приложения. Похоже, что всплеск активности также оказывает некоторое влияние.