ViewModelBase中的依赖注入——最佳实践

本文关键字:最佳 注入 依赖 ViewModelBase | 更新日期: 2023-09-27 18:09:59

我在ViewModelBase中使用LoggerService,这是在构造函数中注入的:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    private ILoggerService _loggerService;
    public ViewModelBase(ILoggerService loggerService)
    {
       _loggerService = loggerService;
    }
    ...
    ...
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

但是在我的ViewModelOne中,继承了ViewModelBase,我需要使用这个服务,我该怎么办?

  • ViewModelBase中公开_loggerService,并从ViewModelOne中使用。
  • ViewModelOne的构造函数中再次注入接口。
在你看来,哪种方法是最好的?还是……你会怎么做?

ViewModelBase中的依赖注入——最佳实践

您不必两次注入ILoggerService。将_loggerServiceprivate修改为protected,如下所示:

private ILoggerService _loggerService;

或者在父类中声明一个getLoggerService,然后调用它来获取子类中的记录器实例:

protected ILoggerService getLoggerService() {
  return _loggerService;
}

请注意,其他类从ViewModelBase获取日志服务是没有意义的,所以最好将getLoggerService声明为protected

让你的ILoggerService受保护并且只读,这样只有基类可以给它赋值

protected readonly ILoggerService _loggerService;

避免将其公开,这样您就只知道一个地方可以检查它,并且只有一个类对它负责,这就是您的基类。