0

我們已經開始在我們公司的新項目。我們敲定架構如下使用SOA架構在Asp.Net MVC中實現存儲庫模式

有5個不同的項目如下

1)BusinessEntities(類庫),其中包含DataContract如下

[DataContract] 
    public class Cities 
    { 
     /// <summary> 
     /// Gets or sets City Id 
     /// </summary> 
     [DataMember] 
     public int Id { get; set; } 

     /// <summary> 
     /// Gets or sets City name 
     /// </summary> 
     [DataMember] 
     [Display(Name = "CityName", ResourceType = typeof(DisplayMessage))] 
     [Required(ErrorMessageResourceName = "CityName", ErrorMessageResourceType = typeof(ErrorMessage))] 
     [RegularExpression(@"[a-zA-Z ]*", ErrorMessageResourceName = "CityNameAlphabates", ErrorMessageResourceType = typeof(ErrorMessage))] 
     [StringLength(50, ErrorMessageResourceName = "CityNameLength", ErrorMessageResourceType = typeof(ErrorMessage))] 
     public string Name { get; set; } 

     } 

2)接口,其包含

[ServiceContract] 
    public interface ICity : IService<CityViewModel> 
    { 
     [OperationContract] 
     Status Add(Cities entity); 
    } 

3)包含實施WCF服務的DAL

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class City : ICity 
{ 
    public Status Add(Cities entity) 
    { 
    //Insert Logic goes here 
    } 
} 

4)WebComponent的這調用WCF服務

public class City 
{ 
    public static Status Add(Cities entity) 
    { 
     using (var service = new WcfServiceProvider<ICity>()) 
     { 
      return service.GetProxy().Add(entity); 
     } 
    } 
} 

5)UI(Asp.Net MVC計劃)中調用WebComponent的訪問服務

City.Add(entity); 

現在我們完成這個結構。但問題是如何使用Repository模式進行單元測試?如果可以的話,是否可以在這個結構上使用存儲庫模式?或者還有其他的模式需要使用嗎?

+1

Deependacy注射,則需要使用嘲弄來測試我們的代碼。使用MoQ – 2013-05-02 05:48:52

+0

@Ravi thx作爲你的答案。做你的任何鏈接或前? – 2013-05-02 05:49:35

+0

http://www.codeproject.com/Articles/29271/Design-pattern-Inversion-of-control-and-Dependency – 2013-05-02 05:50:18

回答

2

我建議您閱讀有關分離問題。現在,您正在將您的業務對象用作DTO和BO。這有效地將您的WCF服務與您的域圖層和UI層耦合。

這意味着版本控制將不可能。如果您想在UI或DL中進行任何更改,則必須確保所有更改都在兩個層中進行,因爲UI將無法與BL進行通話。

擁有專用的DTO會更好,因爲您可以更輕鬆地處理版本問題(如默認值或新引入的屬性等)。


你的命名沒有意義。你的Cities類包含一個城市,對吧?你爲什麼不把它命名爲City


[ServiceContract] 
public interface ICity : IService<CityViewModel> 
{ 
    [OperationContract] 
    Status Add(Cities entity); 
} 

你能解釋一下服務的定義是什麼?我沒有看到視圖模型和DTO之間的關係。同樣的事情在這裏。名稱ICity具有誤導性。如果它是一個存儲庫名稱就像這樣。我們大多數人使用City名稱來指出我們使用的對象,並使用其他名稱(如ICityServiceICityRepository)來指出訪問技術。


我們真正的問題:

但問題是如何使用存儲庫模式進行單元測試?

你不知道。

儲存庫的唯一負有責任是在數據源來加載和存儲數據。你當然可以模擬DbConnection等。但是這並不能保證任何東西,因爲存儲庫有效地耦合到數據源。如果您使用嘲笑你還是會不正確的SQL查詢,無效的列類型,不正確的表關係等獲得故障

因此,如果你真的想確保在倉庫工作,你必須查詢數據庫。