簡體   English   中英

具有實體框架的WCF存儲庫服務模式

[英]WCF Repository Service pattern with entity framework

我需要在silverlight,asp.net等中使用表示層,所以一切都是通過wcf服務。 我在存儲庫層,服務層,wcf服務的實現中有許多疑問

我現在做的事情

  1. 我有存儲庫,它不是每個表根據聚合根創建的
  2. 我有服務層用於執行涉及多個存儲庫的一組操作
  3. WCF服務將方法包裝在服務層和存儲庫層中
  4. 實體由EF自動生成
  5. 傳遞實體並作為完整圖形返回到服務層

6.我有兩個具有所有存儲庫的具體類,以及名為repositorycontainer和service container的服務,將存儲庫容器傳遞給服務

我的存儲庫基礎

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或什么?

  3. 我需要調用存儲庫方法本身,例如:GetCategory()等,也是服務層中的所有方法,所以我需要在wcf服務中包裝兩個方法和服務,這樣好嗎?

  4. 在哪里做緩存? 因為我使用EF我認為有一些方法可以使用EF的緩存提供程序,

該服務/存儲庫容器是否正常?

RepositoryContainer類包含“SurveyRepository” - 但SurveyRepository不應該是RepositoryContainer的實例嗎? 對於ServiceContainer和“SurveyService”也是如此。 如果它們對我來說更有意義(雖然如果不熟悉項目就很難准確評論)。

然后你有: ServiceContainer SurveyService = new ServiceContainer(..);

正如您所知,我得到的印象是“SurveyService”是一個特定的業務概念,但它包含在一個更通用的類型(ServiceContainer)中; 對於SurveyRepository / RepositoryContainer也是如此。

這將打破SRP共同關閉原則和可能的共同重用原則

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

我已經有了服務層,所以我有wcf服務,我稱之為當前服務層servicewrapper或什么?

所以我需要將我的服務(BL)層的名稱更改為服務包裝器或其他東西,然后在wcf服務層中我定義存儲庫和服務中的方法然后只調用服務中的curresponding方法,存儲庫

通常,任何可重用的BL都應該在獨立的包中,而不是在服務層或WCF服務等中封裝(認為是“硬編碼的”)。然后,您將創建位於BL頂部的服務端點。 如果您的業務事務跨越不同的包中的不同業務對象,那么您需要將更高級別的業務流程放在更高的位置 - 我想這可能會在服務層中進行,但這不是一件很重要的事情,你呢?我需要仔細考慮某些責任所在。

如果事務在同一個包中划分不同的業務對象,那么編排要簡單得多,並且可以使用另一個BL類型來完成,該類型旨在處理該作業,該作業將成為該包的一部分 - 而不是在服務層中。

關於命名 - 轉到白板並將所有內容映射出來,然后根據需要重命名。 至少通過單一的內聚概述,您將能夠清楚地了解一切。

BL包應該根據他們的行為命名 - 在業務方面。 包裝它們的WCF服務應該具有適合的名稱,這可以包括對所使用的通道類型的引用(JSON,WebService等)。 因為您可以通過配置更改WCF服務使用的通道(如果服務設計正確),這可能不是一個好主意 - 但假設它沒有,那么額外的清晰度可能會有所幫助。

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

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

在服務中包含服務聽起來有點可疑。 只有外部呼叫者才能通過服務 - 假設服務旨在將BL暴露給外部各方。 內部呼叫者應該知道哪個是適當的呼叫方法(由於是內部的),可能是與服務公開的方法相同。

在哪里做緩存? 因為我正在使用EF我認為有一些方法可以使用EF的緩存提供程序

我不知道你是否可以在EF4中緩存,但如果可以,我不會感到驚訝。 緩存在哪里? - 這取決於您試圖消除的瓶子跪位。

在您的RepositoryContainer中,_SurveyRepository字段是公共的 - 它不應該是私有的嗎? 否則為什么要有只讀(get)SurveyService屬性?

public SurveyRepository _SurveyRepository;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM