2011-06-13 60 views
2

我有一個視圖模型類,它有一個方法,根據viewmodel上的一個日期和使用DateTime.Now的當前時間之間的時間間隔進行計算。如何在ViewModel類上實現依賴注入?

我想能夠單元測試的方法,所以我使用的時間服務,可以在我的測試中被樁住。但是,依賴需要以某種方式注入視圖模型類。當視圖模型返回給控制器時,比如向視圖模型列表添加一個條目,它將被傳遞到控制器方法的參數中。我希望在那時自動將日期服務傳遞到視圖模型中。

有沒有人知道這是如何實現的?我正在使用Mvc3和StructureMap。

+0

時間服務的替代方法是DateTime.Now的靜態替換,它可以被刪除。像https://gist.github.com/1025274一樣 – 2011-06-14 16:31:45

回答

3

我不會在視圖模型上做這樣的計算。在視圖模型上,我會堅持使用POCO屬性。我會在將我的域模型映射到視圖模型的那一刻執行此計算。這可以在控制器操作中或在有權訪問服務層的映射層中完成。

0

而是在視圖模型編寫方法來驗證DOB的,你可以寫一個自定義DOB驗證,如:

public static ValidationResult DOBValidator(DateTime DOB) 
    { 
     if (DOB!= null && DOB.Date != DateTime.MinValue.Date) 
     { 
      int age = DateTime.Now.Year - DOB.Year; 
      if (age < 18) 
      { 
       return new ValidationResult("Sorry, age should be more than 18 years"); 
      } 
     } 

     return ValidationResult.Success; 
    } 
} 

然後你可以裝飾你DOB財產視圖模型的東西,如:

[CustomValidation(typeof(ViewModelClassName), "DOBValidator")] 

在你的單元測試,你可以只調用視圖模型方法,並通過一個虛擬的日期時間值:

DateTime testDOB = DateTime.Now.AddYears(-18); 
     ValidationResult result = ViewModelObject.DOBValidator(testDOB); 
     Assert.AreEqual(ValidationResult.Success, result, "The ValidationResult was incorrect"); 

希望這有助於。