依赖注入和基类

时间:2020-01-30 05:39:39

标签: c# xamarin xamarin.forms

这是在使用Prism的xamarin.forms应用程序中,但问题更是一个基本的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 ctor中,我正在注入“ INavigationService navigationService,IDialogService dialogService”。在我所有的视图模型中,我都在使用NavigationService和DialogService(来自基类),所以这不是冗余代码吗?

我有大约20个视图模型,我将IDialogService添加到我的基类中,并意识到我必须在每个视图模型中更新构造函数。

是否有一种方法可以直接注入基类,并且可以在派生该基类的所有类中使用而不必在类构造函数中指定?

1 个答案:

答案 0 :(得分:2)

将依赖项注入基本类型的简单方法是定义一个新类型以保留所有依赖项;

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)

然后,您只需传递一个构造函数参数,即可轻松添加新的依赖项。