2010-07-22 58 views
3

我需要在silverlight,asp.net等表示層,所以一切都是通過wcf服務。 我在實現庫層,服務層的疑惑數量,WCF服務WCF倉庫服務模式與實體框架

事情我目前做

  1. 我有倉庫,它不是每個表的每一聚集根目錄中創建
  2. 我有做一組涉及多個資源庫行動服務層的
  3. WCF服務包
  4. 的實體由EF
  5. 自動生成的業務層和庫層的方法
  6. 的實體傳遞和返回到服務層爲完整的圖形

6.我有所有的庫包括兩個具體類,服務稱爲repositorycontainer和服務容器,倉庫容器被傳遞給服務

我的倉庫基地

public class RepositoryBase 
    { 
     public DataBaseContext _Context; 
     public RepositoryContainer _RepositoryContainer; 
     public RepositoryBase(RepositoryContainer repositoryContainer) 
     { 
      _RepositoryContainer = repositoryContainer; 
      _Context = repositoryContainer.Context; 
     } 
     public RepositoryBase() 
     { 
      _RepositoryContainer = new RepositoryContainer(); 
      _Context = _RepositoryContainer.Context; 
     } 


    } 

我的倉庫容器

public class RepositoryContainer 
    { 
     public RepositoryContainer() 
     { 
      Context = new DataBaseContext(); 
     } 
     public RepositoryContainer(DataBaseContext context) 
     { 
      Context = context; 
     } 
public DataBaseContext Context 
    { 
     get; 
     set; 
    } 


     public SurveyRepository _SurveyRepository; 
     public SurveyRepository SurveyRepository 
     { 
      get 
      { 
       return _SurveyRepository ?? (_SurveyRepository = new SurveyRepository(this)); 
      }   
     } 


} 

我的服務容器

public class ServiceContainer 
    { 
     public ServiceContainer() 
     { 
      RepositoryContainer = new RepositoryContainer(); 
     } 
     public ServiceContainer(RepositoryContainer container) 
     { 
      RepositoryContainer = container; 
     } 


     public RepositoryContainer RepositoryContainer 
     { 
      get; 
      set; 
     } 
    public SurveyService _SurveyService; 
     public SurveyService SurveyService 
     { 
      get 
      { 
       return _SurveyService?? (_SurveyService= new SurveyService(this)); 
      }   
     } 


    } 

做一次手術 我只是創建RepositoryContainer或的ServiceContainer

然後調用

RepositoryContainer.Repository.Method() 
ServiceContainer.Service.Method() 

我的疑惑是

  1. 是該服務/儲存容器罰款?

  2. 我已經有服務層,所以我有wcf服務什麼我叫當前服務層servicewrapper什麼的?我需要調用存儲庫方法本身,例如:GetCategory()等,也是服務層中的所有方法,所以我需要在wcf服務中包裝方法和服務,這很好嗎?

  3. 在哪裏做緩存?因爲我使用EF我覺得有什麼辦法使用與EF緩存提供商,

+0

- 客戶可以直接訪問各個WCF方法,或通過服務層(其中「集合」的一個或多個WCF方法到一個更大/更復雜的「法」 - 是正確的 - 緩存:是否如果是這樣 - 在哪裏? - ServiceContainer和RepositoryContainer之間的區別是什麼? – 2010-07-25 02:08:18

+0

存儲庫像GetCategories,Insert Delete等一樣,操作/ BL在服務中完成,例如:我有用戶存儲庫,測量存儲庫,當我更新調查時,我更新了用戶(邏輯)中的一個字段,因此它在調查服務中處理,它調用用戶和調查庫方法, 只是我的存儲庫沒有將conatin邏輯,所有的邏輯包裝到服務層,而不是創建每個存儲庫實例,它全部包裝到存儲容器中,所以我只需要創建存儲容器(創建它的一個實例並不昂貴), – 2010-07-25 04:43:10

+0

同樣的服務方式,當創建 服務容器存儲庫容器被傳遞時,它隨後傳遞給每個服務實例,因此在每個服務中不需要創建每個存儲庫實例的每個 注意:somhow我不是IoC粉絲。問題是,我喜歡當前沒有WCF的東西,意味着所有的東西都駐留在一臺服務器上,我需要單獨的apllication服務器(BL),如果它的全部在一起,我只需引用核心dll,創建存儲庫容器實例,服務容器調用方法,現在我需要WCF – 2010-07-25 04:43:28

回答

3

是這樣的服務/程序存儲庫 容器罰款?

RepositoryContainer類包含一個「SurveyRepository」 - 但不應將SurveyRepository作爲RepositoryContainer的實例嗎? ServiceContainer和「SurveyService」相同。如果是的話,這對我來說會更有意義(儘管如果不熟悉該項目就很難準確評論)。

然後你必須:ServiceContainer SurveyService = new ServiceContainer(..);

當你擁有了它,我得到的印象是「SurveyService」是具體的商業概念,但它包裹在一個更通用的類型(的ServiceContainer);與SurveyRepository/RepositoryContainer相同。

這將打破SRP,Common Closure Principle和可能Common Reuse Principle

我不確定別的想法是什麼,但我也不喜歡在它們的類型之後命名實例(除了最基本的senarios - 這不是):public SurveyRepository SurveyRepository類型的名稱應該反映類型是什麼(或是否),它將與它的特定實例(如ServerContainer和ServeyService)不同。

我已經有服務層,所以 ,因爲我有WCF服務就是我所說的 當前服務層servicewrapper 什麼?

所以我需要改變的名字我的服務 (BL)層的東西服務 包裝什麼的,然後在WCF 服務層我 庫和服務定義方法,然後只是調用服務 curresponding方法, 庫

通常,任何可重複使用的BL應該是我n獨立的軟件包,不包含在服務層或WCF服務等中(認爲是「硬編碼」)。然後創建位於BL之上的服務端點。如果你有不同的業務對象在不同的包中,那麼你需要把更高層次的業務流程放在更高的層次 - 我猜這可能會在服務層進行,但這不是一件容易的事情,你需要仔細考慮某些責任在哪裏。

如果scover的同一封裝內的不同業務對象的交易,然後編排是要簡單得多,並且可以與其他BL型設計來處理這項工作,這將是該計劃的一部分來完成 - 而不是在服務層。

關於命名 - 轉到白板並將所有內容映射出來,然後根據需要重命名所有內容。至少通過一個緊密聯繫的概述,您將能夠清楚地瞭解一切。

BL軟件包的命名應與其在業務方面的適用性相符。包裝這些的WCF服務應該有一個適合的名稱,這可能包括對正在使用的通道類型(JSON,WebService等)的引用。因爲您可以通過配置更改WCF服務使用的頻道(如果服務設計正確),這可能不是一個好主意 - 但假設它不會,額外的清晰度可能會有所幫助。

這些文章可能會有所幫助:

我需要調用庫方法 本身例如:的getCategory()等,也 服務層中的所有方法,所以我 需要在wcf服務中包裝兩種方法和服務 ,這很好嗎?

在服務中包裝服務聽起來有點可疑。只有外部呼叫者應該通過服務 - 假定服務旨在將BL暴露給外部方。內部呼叫者應該知道哪個是適當的呼叫方式(由於是內部呼叫),推測它與服務所暴露的方法相同。

在哪裏做緩存?我使用EF是 我覺得有什麼使用緩存提供與EF

我不知道你是否能在EF4緩存 的方式,但如果你可以把它不會讓我感到吃驚。在哪裏做緩存? - 這取決於你想要消除的瓶子在哪裏。

在您的RepositoryContainer中,_SurveyRepository字段是公開的 - 它不應該是私人的嗎?否則,爲什麼要有隻讀(get)SurveyService屬性?

public SurveyRepository _SurveyRepository; 
+0

它的私人..我重新輸入一些代碼在sf,它來錯誤:) – 2010-07-25 04:06:34

+0

感謝您的描述性答案 – 2010-07-27 06:11:51