2011-12-02 129 views
2

我目前正在ASP.NET MVC中編寫一個項目。我有一個Web項目和數據庫項目,只與數據庫一起工作。這些圖層看起來像這樣,它們只能與兄弟圖層進行互操作。每個HttpContext實例一個對象

DB項目(EF CF) - 使DB請求

- 抽象底層數據庫模型

服務 - 所有的業務邏輯一切發生在這裏。

ASP.NET MVC Web應用程序 - 前端呈現

他們必須是鬆耦合的,所以我使用Unity DI/IoC框架

我想實現的是創造的一個實例每個http請求使用DbContext。以下是我迄今實施的邏輯。

public class MyAppBaseController : Controller { 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) { 
     if (HttpContext.Items["DbModel"] == null) { 
      HttpContext.Items["DbModel"] = MySingleton.Container.Resolve<DbContext>(); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

是什麼做的是,在請求管道,如果Items詞典當前HttpContext不具備DbContext,它增加了一個。所有控制器都從它繼承。我這樣做的原因是,在執行過程中調用的所有存儲庫應該對所有連續數據庫調用使用完全相同的DbContext對象。

  1. 有沒有更好的方法來耦合對象的生命週期和HttpContext
  2. 可以使用Unity(DI/IoC框架)嗎?
+0

爲什麼你不」,你可以在統一的對象生命週期管理採取控制你的依賴的情況下壽命使用成員變量來存儲che DbContext而不是使用HttpContext.Items字典? –

+0

@Bugeo你能更具體一些,並通過代碼片段來支持它嗎? – Oybek

+0

https://github.com/ayende/TekPub.Profiler.BackOffice/blob/master/TekPub.Profiler.BackOffice/Controllers/RavenController.cs –

回答

1

按規定here

你將不得不寫你自己的那注入的對象實例中的HttpContext

+0

謝謝你的鏈接。我很可能會檢查'PerThreadLifetimeManager'。由於所有數據庫查詢都將在一個線程中完成,因此最有可能滿足我的要求。 – Oybek