2011-06-17 31 views
10

我的目標是在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自動執行此操作。

回答

10

相反的:

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(); 
} 
+0

沒有區別。 'Dispose()'仍然沒有被調用。 – devuxer

+0

我已經在按照您的建議將數據上下文注入到我的存儲庫/服務中。問題是,我也有ActionFilters,Validators和一個MembershipProvider需要一個數據上下文,並且由於這些對象是由ASP.NET MVC自動實例化的(就像控制器一樣),我使用StructureMap來管理我的生命週期數據上下文。如果您有更好的解決方案,請告訴我。 – devuxer

+0

@DanM,你是對的,我已經測試過了,似乎'StructureMap'不會在請求結束時自動處理'IDisposable' HttpContext作用域對象。在Application_EndRequest中調用'ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects'可能是確保所有對象都發生這種情況的最好方法。 –

5

使用a nested container是讓結構映射到自動釋放對象的唯一途徑。如果你不使用這種技術,唯一的方法就是使用OP描述的方式自己處理對象(將對象從容器中拉出並放置它;請參閱NHibernate example以瞭解執行該操作的一種方法)或者範圍對象到達HttpRequest並調用ReleaseAndDisposeAllHttpScopedObjects描述爲Darin。

+0

+1,謝謝,PHeiberg。嵌套容器看起來像一個有趣的解決方案,但如果我使用了代碼示例鏈接到我的情況,我相信它會爲每個請求處理我的數據上下文幾次。我的目標是每個請求只有一個數據上下文。它也看起來會導致更多的代碼。所以,我想我會堅持Darin的解決方案。如果我誤解了,請糾正我。 – devuxer

+0

使用嵌套容器時,您將爲每個請求創建一個嵌套容器實例,並在請求結束時處理它。處置一個嵌套容器將處理其中創建的所有瞬態對象。我還沒有看到任何使用ASP.NET MVC或Webforms的嵌套容器的例子。 Jeremy的例子是使用Fubu和NHibernate(http://codebetter.com/jeremymiller/2010/01/06/how-dovetail-uses-structuremap-with-nhibernate)。對於簡單的情景,達林或你的方式可能是最簡單的。我已經將它們用於所有帶SM的Web應用程序。 – PHeiberg

+1

我只是像在鏈接文章中提到的那樣添加嵌套容器,將所有實例的作用域限定爲父容器中的所有實例,但不包含瞬態(Singletons,HttpContext範圍對象,ThreadLocalStorage範圍對象等)。這些對象不會從嵌套容器中丟棄。所以如果我的理解是好的,HttpContextScoped對象將不會被處置。 –

相關問題