2011-12-02 58 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