我的目标是在ASP.NET MVC中为每个HTTP请求设置一个数据上下文(MainDbContext
),并在请求结束时处理数据上下文。
我正在使用以下StructureMap配置:
public static class ContainerConfigurer
{
public static void Configure()
{
ObjectFactory.Initialize(x =>
{
x.For<MainDbContext>().HttpContextScoped();
});
}
}
每当我需要MainDbContext
时,我就会使用此代码:
var dbContext = ObjectFactory.GetInstance<MainDbContext>();
这正如预期的那样工作:每个HTTP请求只创建一个数据上下文。问题是,MainDbContext
未在请求结束时处理。
如何在HTTP请求完成后配置我的ObjectFactory来处理数据上下文?或者这只是我需要在Global.asax中使用Application_EndRequest()
手动完成的事情。
更新
我刚尝试将以下代码添加到Global.asax:
protected virtual void Application_EndRequest()
{
ObjectFactory.GetInstance<MainDbContext>().Dispose();
}
正如所料,这解决了这个问题。我仍然想知道是否有任何方法可以自动使用StructureMap。
答案 0 :(得分:10)
而不是:
x.For<MainDbContext>().HttpContextScoped();
尝试:
x.For<MainDbContext>().HttpContextScoped().Use(() => new MainDbContext());
通常它也是需要db上下文的存储库类。因此,代替ObjectFactory.GetInstance<MainDbContext>();
使您的存储库获取一些接口db上下文并配置StructureMap以将MainDbContext
注入其中。然后使StructureMap将存储库注入控制器,...
击>
在Application_EndRequest
:
protected void Application_EndRequest()
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}
答案 1 :(得分:5)
使用a nested container是使Structure Map自动处理对象的唯一方法。如果您不使用该技术,唯一的方法是使用OP描述的方式自己处置对象(从容器中拉出对象并将其丢弃;请参阅此NHibernate example以获得一种方法)或将对象范围限定为HttpRequest并调用ReleaseAndDisposeAllHttpScopedObjects,如Darin所述。