2014-01-21 27 views
1

我在使用存儲庫模式的數據層中首先使用實體​​框架代碼。我目前正在設計我的WCF Web服務來連接到數據層,我只是對如何與數據層進行連接感到困惑。在EF WCF服務中使用上下文和存儲庫

在我的數據層測試項目中,我爲每個測試創建了一個新的DbContext類,並將其包裝在一個使用塊中,在此創建存儲庫類,傳入上下文作爲構造函數參數。然後我可以調用存儲庫上的方法來獲取數據。

這是正確的一開始,然後我做同樣的WCF服務方法?

例如,我會

public class UserService : IUserService 
    { 
     public bool CheckEmailAvailability(string email) 
     { 
      try 
      { 
       using (var context = new MyDbContext()) 
       { 
        var repository = new UserDataRepository(context); 
        var emailAvailable = 
         repository.GetItems().Count(
          u => u.EmailAddress.Equals(email, StringComparison.InvariantCultureIgnoreCase)) == 0; 

        return emailAvailable; 
       } 
      } 
     } 
    } 

還是我使用上下文/存儲庫的概念錯了嗎?

這也讓我覺得在這裏使用DI會很方便,所以我可以在WCF服務測試項目中模擬數據上下文/資源庫對象。這是通常做的事情,如果是這樣,有沒有人有任何鏈接到這個例子或教程?

回答

1

首先,是的,最好是注入存儲庫,或者(如果您選擇的DI框架無法解決它們)存儲庫的工廠。

此外,從您的服務中刪除上下文的想法可能是一個好主意。在我看來,存儲庫和它的助手應該處理上下文,並且如果需要的話,在組裝實體所需的各種DB調用之間共享上下文。然後這些服務可以從存儲庫請求實體,而不用擔心它們是否來自數據庫或其他數據存儲。

public class UserService: IUserService 
{ 
    IUserRepository userRepository; 

    ... // ctor to inject repository 

    public bool CheckEmailAvailability(string email) 
    { 
     var emailAvailable = !userRepository.GetUserEmails().Any(u => u.EmailAddress.Equals(email, StringComparison.InvariantCultureIgnoreCase)); 

     return emailAvailable;        
    } 
} 

public class UserRepository: IUserRepository 
{ 
    ... 

    public IEnumerable GetUserEmails() 
    { 
     // actually this context should be handled more centrally, included here for sake of illustration 
     using (var context = new MyDbContext()) 
     { 
      return repository.GetItems(); 
     } 
    } 
} 

最後,關於WCF服務,我不確定最好的建議是什麼。我已經看到了在業務邏輯中創建WCF服務的代碼,這很糟糕,但是卻是老式的WPF代碼庫和有限的DI的限制。更好的情況是ChannelFactory或服務工廠可以注入到服務層。您可能會在Dependency Injection wcf找到答案。

和往常一樣,如果您打算使用TDD代碼,我肯定會推薦在應用程序的各個接口層之間包裝交叉點,以便它們更容易模擬出來。這聽起來像你在那裏有正確的想法。

+0

我一直在討論有哪些方法來獲取上下文和存儲庫,並且認爲只有代碼處理存儲庫才更有意義。問題是如果你不得不對結果進行查詢,例如你在存儲庫上有一個名爲GetItems()的方法。在此範圍內,您可以在使用塊中創建上下文,從EF中選擇並將結果作爲Queryable()返回。您可以不查詢調用方法中的項目作爲上下文已處理 – NZJames

+0

啊,我明白了。我必須承認,我已經忘記了與EF的特殊皺紋。在我使用EF進行數據庫定義的最後一個項目中,最初的選擇將從存儲庫中的EF中進行(例如,通過emailaddress選擇或全選)並作爲集合解析,然後業務邏輯將使用linq來執行還有什麼,它與返回的集合想要的。根據我的經驗,很多時候EF比它的價值更麻煩,像SimpleData這樣的替代品更容易處理。我希望這有幫助。 – Stark