Asp.net

使用 HttpContextScoped() 時,StructureMap 未處理數據上下文

  • April 5, 2013

我的目標是擁有一個數據上下文(MainDbContext在 ASP.NET MVC 中為每個 HTTP 請求提供一個數據上下文 (),並在請求結束時處理數據上下文。

我正在使用以下 StructureMap 配置:

public static class ContainerConfigurer
{
   public static void Configure()
   {
       ObjectFactory.Initialize(x =>
       {
           x.For<MainDbContext>().HttpContextScoped();
       });
   }
}

每當我需要 aMainDbContext時,我都會使用以下程式碼:

var dbContext = ObjectFactory.GetInstance<MainDbContext>();

這按預期工作:每個 HTTP 請求只創建一個數據上下文。問題是,MainDbContext在請求結束時沒有被處理。

如何配置我的 ObjectFactory 以在 HTTP 請求完成時處理數據上下文?或者這只是我需要Application_EndRequest()在 Global.asax 中手動使用的東西。

更新

我剛剛嘗試將以下程式碼添加到 Global.asax:

protected virtual void Application_EndRequest()
{
   ObjectFactory.GetInstance<MainDbContext>().Dispose();
}

正如預期的那樣,這解決了問題。但是,我仍然想知道是否有任何方法可以使用 StructureMap 自動執行此操作。

代替:

x.For<MainDbContext>().HttpContextScoped();

嘗試:

x.For<MainDbContext>().HttpContextScoped().Use(() => new MainDbContext());

通常也是需要數據庫上下文的儲存庫類。因此,不要ObjectFactory.GetInstance<MainDbContext>();讓您的儲存庫獲取一些介面數據庫上下文並配置 StructureMap 以將其MainDbContext註入其中。然後讓 StructureMap 將儲存庫注入控制器,…

Application_EndRequest

protected void Application_EndRequest()
{
   ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

引用自:https://stackoverflow.com/questions/6390608