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

Dependency Injection in ViewModelBase - Best practice

我在 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));
    }
}

但是在我继承自ViewModelBaseViewModelOne中,我需要使用这个服务,怎么办?

您认为哪种方法最好?或者……你会怎么做?

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

private ILoggerService _loggerService;

或者在supperclass中声明一个getLoggerService然后在subclass中调用它获取logger实例:

protected ILoggerService getLoggerService() {
  return _loggerService;
}

请注意,其他 classes 从 ViewModelBase 获取记录器服务是没有意义的,因此最好将 getLoggerService 声明为 protected

使您的 ILoggerService 受保护且只读,以便只有基 class 可以为其赋值。

protected readonly ILoggerService _loggerService;

不要这样做public这样你只知道一个地方可以检查它并且只有一个class负责它,这是你的基地class。