2015-02-05 139 views
3

介紹EF N層架構

我們需要建立一個n層應用程序,因爲我們想在多個平臺上分享我們的BL和只寫我們的DAL一次。我已經在這個主題上做了一些研究。

在大衛皮拉斯的帖子中可以看到:MVC3 and Entity Framework每個VS解決方案必須至少有4層。到現在爲止還挺好。

他還指出,DAL項目是唯一允許甚至知道EF正在使用的項目。

問題1:

我假設,即「接口」項目的接口是我的EF實體的1對1的表示,我是正確的呢?另外,這些接口應該用作不同層之間的類型?

問題2:

MSDN建議一個的DbContext的壽命應爲每一個請求上下文的WebApp,並且在WPF或WinForms項目每形成一個上下文。那麼,如何在不向我的GUI層添加「System.Data.Entity」的情況下實現這一目標?

Thnx提前!

+0

thnx爲downvote,如果我失去了一些東西,請關心評論..我已經投入了一些精力和時間來問這些問題。 –

回答

2

首先不要!!!在多個平臺上分享您的DAL。分享您使用DAL的BL。只要你的BL代表你的應用程序需求的解決方案,你不需要公開你的DAL,請不要。另外公開DAL的缺點是將更多漏洞暴露給黑客,直接訪問DAL爲BL中的業務邏輯,控制和驗證提供了一種btpass機制。

答案1: 可能但不需要。考慮到SOA,我建議使用DTO。要麼它們是實體或更復雜的幾個和/或部分實體的組合類。如果使用實體,則可以更靈活地通過BL提供信息(您可以通過一次方法調用同時發送多個數據部分),並將第三方用戶的實體(也是數據庫結構)隱藏起來,從而提供更好的安全感。

回答2: 再次,考慮SOA的思想,不要根據您的用戶界面構建您的BL /服務方法。 BL(顧名思義)根據「如何完成工作」而不是「」如何由用戶在屏幕上完成工作「提供數據。如果您嘗試從GUI管理數據,您也將開始違反N層體系結構。 不要!!!使用DAL之外的任何數據特定類和/或方法。這將是分層的真正用途。

問候。

+0

Thnx爲您的快速反應!我很抱歉,我的意思是說沒有將DAL分享給其他GUI,而是隻寫一次!我的錯。 –

+0

如果我有幫助,我很高興。 – user3021830

+0

是的,你有幫助;)。我會在幾個小時內回答問題,我還在等待更多意見,而且我認爲當問題仍未得到答覆時,人們更加渴望。 –

3

您需要使用Unit of WorkRepository模式和依賴注入框架,如StructureMapUnity

基本上,你需要做的是創造的接口:

public interface IUnitOfWork 
{ 
    void SaveChanges(); 
} 

public interface IRepository<TItem> 
{ 
    TItem GetByKey<TKey>(); 

    IQueryable<TItem> Query(); 
} 

現在,在DbContext類實現的接口上面,有的地方在業務層註冊接口的實現:

public void RegisterDependencies(Container container) 
{ 
    // Container is a Structure Map container. 
    container.ForRequestedType<IUnitOfWork>() 
     .CacheBy(InstanceScope.HttpContext) 
     .TheDefaultConcreteType<DbContext>();  
} 

請參閱StructureMap Scoping Docs瞭解如何配置實例的範圍。

現在,隨着地方所有的代碼,每個Business Layer類需要進行一些數據的操作是這樣的:

public class SomeService 
{ 
    public SomeService(IRepository<SomeItem> repository, IUnitOfWork unitOfWork) 
    { 
     this.repository = repository; 
     this.unitOfWork = unitOfWork; 
    } 

    public void MarkItemCompleted(int itemId) 
    { 
     var item = repository.GetByKey(itemId); 
     if(item != null) 
     { 
      item.Completed = true; 
      unitOfWork.SaveChanges(); 
     } 
    } 
} 

現在,隱藏後廠式服務的創建:

public class ServiceFactory 
{ 
    private readonly Container container;// = initialize the container 

    public TService CreateService<TService>() 
    { 
     return container.GetInstance<TService>(); 
    } 
} 

而在你的GUI層只調用通過ServiceFactory創建的服務類的方法;如果您的GUI是ASP.NET MVC項目,則不需要創建ServiceFactory類 - 您可以從DefaultControllerFactory派生並覆蓋GetControllerInstance方法。一個例子見the answer here

+0

Thnx爲您的明確迴應!這非常有幫助。我已經遇到了Repositry和UOW模式。我認爲回購的實施應該在DAL中,我是否正確? Thnx再次。 –

+0

@MarkRijsmus,是的,它應該在數據訪問。 – RePierre