Внедрение зависимостей и базовые классы - PullRequest
1 голос
/ 30 января 2020

Это в приложении xamarin.forms, использующем Prism, но этот вопрос скорее фундаментальный c# вопрос, над которым я путаюсь.

Я использую внедрение зависимостей, и мои типы зарегистрированы в файле app.xaml.cs -> метод RegisterTypes.

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterDialog<BusyDialog, BusyDialogViewModel>();

        containerRegistry.RegisterForNavigation<NavigationPage>();
        containerRegistry.RegisterForNavigation<MainPage, MainPageViewModel>();
    }

Мой ctor модели базового представления определен как:

    public ViewModelBase(INavigationService navigationService, IDialogService dialogService)
    {
        NavigationService = navigationService;
        DialogService = dialogService;
    }

И все остальные модели представления получают этот базовый класс. Например.

    public MainPageViewModel(INavigationService navigationService, IDialogService dialogService)
        : base(navigationService, dialogService)
    {
    }

Мой вопрос заключается в том, что в этом окне MainPage я внедряю 'INavigationService navigationService, IDialogService dialogService'. Во всех моих моделях просмотра я использую NavigationService и DialogService (из базового класса), поэтому не является ли это избыточным кодом?

У меня есть около 20 моделей представления, я добавил IDialogService к своему базовому классу и понял, что мне нужно обновлять конструкторы в каждой модели представления.

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

1 Ответ

1 голос
/ 30 января 2020

Простой способ внедрить зависимости в базовый тип - это определить новый тип, который будет содержать все зависимости;

public class ViewModelBaseDependencies{
    public ViewModelBaseDependencies(INavigationService navigationService, IDialogService dialogService){
    //...
}
public ViewModelBase(ViewModelBaseDependencies dependencies)
{
    NavigationService = dependencies.NavigationService;
    DialogService = dependencies.DialogService;
}
public MainPageViewModel(ViewModelBaseDependencies dependencies)
        : base(dependencies)

Тогда вам нужно только передать один аргумент конструктора и тривиально добавить новый зависимостей.

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