2011-07-11 52 views
3

我正在使用ASP.NET MVC3和SQL Server中的數據庫的Web應用程序項目。還有一個移動應用程序通過REST服務使用來自同一數據庫的數據。下面是我的一些應用程序層:.NET REST服務,實體框架和鬆耦合

  • 模式 - ADO.NET數據模型,使用實體框架

  • 數據訪問層 - 與查詢從數據庫中retrive數據存儲庫

  • Web應用程序 - 用結構圖和DI MVC3項目,使用存儲庫,鬆耦合,數據庫環境被設置在底了HttpReques t

  • 核心 - DAL和服務層之間的另一層,使用存儲庫並將數據公開到服務層。各種業務邏輯層。

  • 服務層 - REST服務知道核心層而不是DAL。將數據映射到DTO的,並公開給客戶

我這樣的應用程序架構有問題是在服務層的鬆耦合。服務層具有對核心層的引用。核心層具有對數據訪問層的引用並使用其存儲庫。雖然存儲庫沒有默認構造函數。他們期望1個參數和它的數據庫對象上下文(一次性對象)。

在我的網站使用資料庫直接是沒有問題的。我正在使用結構圖,DI使它鬆散耦合。每個上下文都被放置在HttpRequest的末尾。

問題是服務層和核心層。我想在那裏有鬆散的耦合,但不知道如何實現它?如何將數據上下文注入到這些數據上並確保它在某個時刻被處理?我想聽聽一些關於如何把它放在一起的建議。

回答

5

服務層具有參照芯層。

這很好。

核心層引用數據訪問層並使用其存儲庫。

那不是罰款。

你的「核心」應該是你的域,業務規則和邏輯。它不應該有任何依賴。從堆的底部

開始:

  1. 回購 - 對其它層沒有依賴關係。
  2. 服務 - 依賴核心和回購。
  3. 核心 - 不依賴於其他圖層。
  4. 網絡 - 依賴於一切。

這就是我們的做法。我們使用接口驅動編程和依賴注入的組合來處理鬆散耦合。

實施例流程:

  1. HTTP請求到來時(API,網絡層等)
  2. 控制器找到。 DI容器看到容器依賴於ISomethingService並解決它,包括任何進一步的依賴關係(服務,回購等)。
  3. 控制器調用方法ISomethingService
  4. ISomethingService執行(由DI選擇)調用方法ISomeRepo
  5. ISomeRepo實現(由DI選擇)調用EF/DB,返回「數據對象」服務。
  6. 服務將「數據對象」映射到「核心」對象並返回到控制器。

這些對象的實例化應該由您的DI容器來處理。上面我們使用的唯一缺少的是「工作單元」,它基本上包裝了EF上下文。

+0

我在另一個項目中獲得了我的模型,因此存儲庫對該圖層具有依賴性。存儲庫是使用T4模板從Model.edmx生成的。我也對DI和Web上的鬆耦合沒有任何問題,它完美地工作,並且EF上下文在請求結束時處理。我還想提一下,我沒有使用服務來直接在網絡上獲取數據,而是使用存儲庫。服務僅用於移動應用程序。我不確定如何實現服務端的鬆耦合,因爲Service實例化一個需要EF Context作爲其構造函數參數的Repository。 –

+0

@Nebo - Repo採用EF上下文還是接口?它應該有一個接口,例如'IUnitOfWork'。在引擎蓋下,你會實現一個包裝EF上下文的'EntityFrameworkUnitOfWork' - 這就是你鬆散耦合的方式。只有您的存儲庫應該引用EF程序集。 – RPM1984

+0

這是我的一個倉庫:http:// screencast。COM /噸/ IVHzTVIx。 這是Core的經理之一(在Repo和Service之間):http://screencast.com/t/qCgoVTlGLZy。 這是服務(在這裏沒有構造函數,因爲我有問題託管它):http://screencast.com/t/Is3zpkrVP。 ServiceHost只支持類服務類型,所以我不能託管一個接口,而是一個類。 –

1
public ServiceLayerClass() 
{ 
    private ICoreLayerClass coreLayerClass; 

    public ServiceLayerClass(ICoreLayerClass coreLayerClass) 
    { 
     this.coreLayerClass = coreLayerClass; 
    } 

    public void DoSomeWork() 
    { 
     coreLayerClass.DoSomeWork(); 
    } 
} 

public CoreLayerClass() 
{ 
    private ISomeRepository someRepository; 

    public CoreLayerClass(ISomeRepository someRepository) 
    { 
     someRepository = this.someRepository; 
    } 

    public void DoSomeWork() 
    { 
     someRepository.DoSomeWork(); 
    } 
} 

public SomeRepository() 
{ 
    public SomeRepository(IUnitOfWork uow) 
    { 
    } 

    public void DoSomeWork() 
    { 
     //do some work 
    } 
} 

備註: 理想情況下,將根據HttpContext創建UnitOfWork。即,您的datacontext將在開始請求時開始其生命,並將在最後處理。每個請求只能使用一個。

+0

這是我現在得到它的方式。不知道如何設置DI來解決從Service到Repository的所有依賴關係,以及如何確保IUnitOfWork(數據上下文)被處置。 –

+0

我試圖讓我的DataContext每HttpContext創建,但由於這是一個Web服務,而不是一個MVC應用程序(它被放置在請求的末尾),我得到一個StructureMap未知的錯誤,如果我設置生命週期HttpContextScoped爲我的DataContext。 –

+0

這是一個WCF Rest或ASP.Net MVC Rest嗎? – ravi