UWP MVVM Template10: доступ к одному экземпляру внешнего API через приложение - PullRequest
0 голосов
/ 12 сентября 2018

Мне было поручено взять частично разработанное крупногабаритное и сложное приложение UWP с использованием MVVM с помощью шаблона 10. Приложение должно использовать собственный API веб-сервисов, и его нужно использовать практически для каждой функции, начиная с с начальной страницы входа.

Итак, если мне нужно получить доступ к одному экземпляру API везде, как мне поступить правильно? Я справедливо использовал MVVM, но никогда не использовал Template10, и мне никогда не приходилось делить экземпляр объекта во всем приложении MVWM UWP.

Пока я могу думать о трех направлениях:

  1. Объявление и создание экземпляра API в Appl.xaml.cs и его глобальное использование
  2. Создайте общедоступный класс Globals и создайте экземпляр как общедоступное статическое свойство: c# public class Globals { private static OurAPI _ourAPI; public static OurAPI API { get { return _ourAPI; } set { _ourAPI = value; } } }

  3. Создайте API-интерфейс на странице входа в систему, а затем передайте его в качестве параметра между ViewModels, предположительно с помощью службы навигации.

Я думаю, что 1 или 2, скорее всего, не соответствуют MVVM и могут вызвать проблемы с модульным тестированием, так что, возможно, 3 - лучший вариант? Или есть другой, более правильный способ сделать это, чтобы придерживаться концепций Template10 / MVVM, а также иметь возможность его модульного тестирования?

РЕДАКТИРОВАТЬ: Извините за код, не форматирующий, окно редактирования форматирует это хорошо, но когда я сохраняю его, он возвращается к одному длинному предложению: - (

1 Ответ

0 голосов
/ 12 сентября 2018

Лучшее решение состоит из синглтона обслуживания и инверсии управления (IoC) / Зависимостивпрыск .Это довольно сложная тема, поэтому я определенно рекомендую прочитать об этом из нескольких источников.

Итак, сначала вы создаете интерфейс для своего сервиса, где вы объявляете всех открытых членов и методов.Затем вы создаете реализацию интерфейса.Затем вы используете контейнер IoC и регистрируете свой сервис как одноэлементный (единичный экземпляр), а затем интегрируете IoC, чтобы он создавал экземпляры ваших моделей представлений.Затем вы можете поместить интерфейс в качестве параметра конструктора вашей модели представления, и контейнер IoC обязательно предоставит зарегистрированный экземпляр Singleton.

В вашем случае вы используете шаблон 10, который можно интегрировать с различнымиКонтейнеры IoC, как видно в документации .Посмотрите AutoFac в качестве примера контейнера IoC.Вы можете увидеть некоторые примеры регистрации и разрешения службы в документации.

Для общего решения проверьте этот SO вопрос , который демонстрирует использование AutoFac в UWP.

Youтакже можно увидеть некоторые примеры кода в этом SO вопросе и этом специально для шаблона 10.

Это решение лучше, чем использование static и глобальных экземпляров, потому что вына самом деле никогда не имейте дело с какой-либо жестко заданной ссылкой и всегда работаете только с интерфейсом.Вы помещаете интерфейс в качестве параметра вашего конструктора, а IoC позаботится о предоставлении вам экземпляра.Кроме того, вы можете в любое время поменять местами реализацию интерфейса для другого класса, и вам просто нужно обновить его в одном месте - регистрации IoC.

...