創建服務:
interface IDialogService
{
void ShowMessageBox(string message);
}
實現:
class DialogService : IDialogService
{
public void ShowMessageBox(string message)
{
MessageBox.Show(); // ...
}
}
使用依賴注入:
class ViewModel
{
[Import] // This is MEF-specific sample
private readonly IDialogService dialogService;
}
或服務定位:
class ViewModel
{
private AnyCommandExecute()
{
// This is MEF-specific sample
var dialogService = container.GetExportedValue<IDialogService>();
}
}
在您的視圖模型中獲取具體IDialogService
,然後從ViewModel調用獲得的實現。
同樣的方法適用於任何其他類似的情況:顯示打開/保存對話框,顯示在對話框中輸入自定義視圖模式。
看起來簡單,是有意義的。但是,如果我通過不實現ShowMessageBox()來實現ViewModel抽象,並且有一個用於單元測試的實現,另一個用於生產性用途,那麼我最終會得到沒有依賴注入的相同效果。對這種做法有何評論或批評? – Krumelur
1)這違反了SRP。你讓視圖模型負責任何事情。 2)而不是2個服務實現(一個用於生產,一個用於測試),您應該保留每個視圖模型的2個實現,這需要這個功能。 3)考慮這一點:'SomeViewModel'需要顯示消息框,並且它具有抽象的'ShowMessageBox'; 'SomeDerivedViewModel:SomeViewModel'不需要顯示它,但是你已經有了這個方法。 – Dennis