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
的构造函数中再次注入接口。
您不必两次注入ILoggerService
。将_loggerService
从private
修改为protected
,如下所示:
private ILoggerService _loggerService;
或者在父类中声明一个getLoggerService
,然后调用它来获取子类中的记录器实例:
protected ILoggerService getLoggerService() {
return _loggerService;
}
请注意,其他类从ViewModelBase
获取日志服务是没有意义的,所以最好将getLoggerService
声明为protected
。
让你的ILoggerService受保护并且只读,这样只有基类可以给它赋值
protected readonly ILoggerService _loggerService;
避免将其公开,这样您就只知道一个地方可以检查它,并且只有一个类对它负责,这就是您的基类。