2015-08-27 71 views
0

我使用的是LoggerService在我ViewModelBase,這是在構造函數中注入:依賴注入ViewModelBase - 最佳實踐

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繼承,我需要使用這項服務,有什麼我應該怎麼做?

  • 做公益的_loggerServiceViewModelBaseViewModelOne使用它。
  • 再次在ViewModelOne的構造函數中注入接口。

在您看來,哪種方法最好?或...你會怎麼做?

+0

你可以讓_loggerService保護 – InferOn

回答

1

使您的ILoggerService受保護並只讀,以便只有基類可以爲其分配值。

protected readonly ILoggerService _loggerService; 

從做公有的,因此你只知道一個地方進行檢查,並只有一個類有責任就可以了,這是你的基類副歌。

+0

非常感謝你! –

+0

不客氣!很高興幫助你! – jtabuloc

2

您不必注入ILoggerService兩次。改變從private_loggerServiceprotected如下:

private ILoggerService _loggerService; 

還是在晚飯類聲明getLoggerService然後調用它來獲取記錄器實例中的子類:

protected ILoggerService getLoggerService() { 
    return _loggerService; 
} 

注意,它是沒有意義對於其他類從ViewModelBase獲得記錄器服務,因此最好將getLoggerService聲明爲protected