我的目標是在ASP.NET MVC中爲每個HTTP請求創建一個數據上下文(MainDbContext
),並在請求結束時處理數據上下文。StructureMap在使用HttpContextScoped()時不處理數據上下文()
我使用以下StructureMap配置:
public static class ContainerConfigurer
{
public static void Configure()
{
ObjectFactory.Initialize(x =>
{
x.For<MainDbContext>().HttpContextScoped();
});
}
}
每當我需要一個MainDbContext
,我使用這個代碼:
var dbContext = ObjectFactory.GetInstance<MainDbContext>();
這是按預期工作:只有一個數據上下文正在根據HTTP請求創建。問題是,MainDbContext
不會在請求結束時處理。
如何配置我的ObjectFactory在HTTP請求完成時處置數據上下文?或者這只是我需要在Global.asax中使用Application_EndRequest()
手動執行的操作。
更新
我只是想加入以下代碼到Global.asax中:
protected virtual void Application_EndRequest()
{
ObjectFactory.GetInstance<MainDbContext>().Dispose();
}
正如預期的那樣,這解決了問題。不過,我仍然想知道是否有任何方法可以用StructureMap自動執行此操作。
沒有區別。 'Dispose()'仍然沒有被調用。 – devuxer
我已經在按照您的建議將數據上下文注入到我的存儲庫/服務中。問題是,我也有ActionFilters,Validators和一個MembershipProvider需要一個數據上下文,並且由於這些對象是由ASP.NET MVC自動實例化的(就像控制器一樣),我使用StructureMap來管理我的生命週期數據上下文。如果您有更好的解決方案,請告訴我。 – devuxer
@DanM,你是對的,我已經測試過了,似乎'StructureMap'不會在請求結束時自動處理'IDisposable' HttpContext作用域對象。在Application_EndRequest中調用'ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects'可能是確保所有對象都發生這種情況的最好方法。 –