[英]Dependency injection for repository pattern in WCF service using Entity Framework
[英]WCF Repository Service pattern with entity framework
我需要在silverlight,asp.net等中使用表示層,所以一切都是通過wcf服務。 我在存儲庫層,服務層,wcf服務的實現中有許多疑問
我現在做的事情
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()
我的懷疑是
該服務/存儲庫容器是否正常?
我已經有了服務層,所以我有wcf服務,我稱之為當前服務層servicewrapper或什么?
我需要調用存儲庫方法本身,例如:GetCategory()等,也是服務層中的所有方法,所以我需要在wcf服務中包裝兩個方法和服務,這樣好嗎?
在哪里做緩存? 因為我使用EF我認為有一些方法可以使用EF的緩存提供程序,
該服務/存儲庫容器是否正常?
RepositoryContainer
類包含“SurveyRepository” - 但SurveyRepository不應該是RepositoryContainer的實例嗎? 對於ServiceContainer
和“SurveyService”也是如此。 如果它們對我來說更有意義(雖然如果不熟悉項目就很難准確評論)。
然后你有: ServiceContainer SurveyService = new ServiceContainer(..);
正如您所知,我得到的印象是“SurveyService”是一個特定的業務概念,但它包含在一個更通用的類型(ServiceContainer)中; 對於SurveyRepository / RepositoryContainer也是如此。
我不確定其他人的想法,但我也不喜歡在它們的類型之后命名實例(除了最基本的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.