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));
}
}
但是在我继承自ViewModelBase
的ViewModelOne
中,我需要使用这个服务,怎么办?
- 做 public
ViewModelBase
中的 _loggerService
并从 ViewModelOne
使用它。
- 在
ViewModelOne
的构造函数中再次注入接口。
您认为哪种方法最好?或者……你会怎么做?
您不必注入 ILoggerService
两次。将 _loggerService
从 private
更改为 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。
我在 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));
}
}
但是在我继承自ViewModelBase
的ViewModelOne
中,我需要使用这个服务,怎么办?
- 做 public
ViewModelBase
中的_loggerService
并从ViewModelOne
使用它。 - 在
ViewModelOne
的构造函数中再次注入接口。
您认为哪种方法最好?或者……你会怎么做?
您不必注入 ILoggerService
两次。将 _loggerService
从 private
更改为 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。