Различия и сходства между: ViewModelLocator, ServiceLocator, внедрение зависимостей - PullRequest
1 голос
/ 21 февраля 2020

Я запутался в шаблонах: ViewModelLocator, ServiceLocator, Dependency Injection.

. Последний вывод таков:

ViewModelLocator. Место для подключения View и ViewModel.

public ViewModelLocator()
{
    SimpleIoc.Default.Register<MainViewModel>();
    SimpleIoc.Default.Register<SettingViewModel>();
}

public MainViewModel MainViewModel => SimpleIoc.Default.GetInstance<MainViewModel>();
public SettingViewModel SettingViewModel => SimpleIoc.Default.GetInstance<SettingViewModel>();

// View
private MainViewModel ViewModel => ViewModelLocator.Current.MainViewModel;

Внедрение зависимости . Набор принципов для слабых связей. Часто через конструктор.

private readonly INavigationService _navigation;

public ShellViewModel(INavigationService navigation)
{
    _navigation = navigation;
}

ServiceLocator. Что это? То же самое, что и ViewModelLocator, но многие считают его антипаттерном? Оказывается ViewModelLocator тоже плохо. Но как тогда подключить View и ViewModel? ServiceLocator нужно только хранить сервисы? Как вы понимаете, вся путаница возникла из ServiceLocator.

Не могли бы вы объяснить различия и сходства между этими элементами? Чтобы окончательно однозначно идентифицировать и правильно их использовать. Спасибо за любую помощь.

1 Ответ

3 голосов
/ 21 февраля 2020

Вы недавно задали связанный вопрос , и из него я делаю вывод, что ViewModelLocator et c. происходят из примера базы кода, на которую вы ссылаетесь. Из того, что я извлек из примеров кода, показанных до сих пор, не похоже, что кодовая база является лучшим примером использования Dependency Injection.

Таким образом, любой вопрос, который включает объяснение «шаблонов» в этом коде Основание должно быть встречено ответом му .

Вопрос подразумевает ложную предпосылку. Предпосылка состоит в том, что есть чему поучиться из этой кодовой базы. Это может быть не так.

Сервисный локатор не шаблон; это анти-паттерн . (Большинство людей, похоже, согласны со мной, и до сих пор никто не смог выдвинуть убедительный контраргумент.)

Внедрение зависимости не является паттерном; это набор принципов проектирования и (нескольких) шаблонов. Это то, что мы пытались описать в нашей книге .

как тогда подключаться View и ViewModel?

Лучшие Я полагаю, что объяснение модели MVVM до сих пор Jo sh Оригинальная статья Смита . Если вы хотите увидеть полный пример кода, который объединяет MVVM и Dependency Injection, он доступен с первой редакцией Dependency Injection in. NET (которая также включена в качестве бесплатной электронной книги с новым редакция).

ServiceLocator требуется только для хранения Служб?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...