我的目标是在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().
更新
protected virtual void Application_EndRequest() { ObjectFactory.GetInstance<MainDbContext>().Dispose(); }
解决方法
代替:
x.For<MainDbContext>().HttpContextScoped();
尝试:
x.For<MainDbContext>().HttpContextScoped().Use(() => new MainDbContext());
通常也是需要数据库上下文的存储库类.所以代替ObjectFactory.GetInstance< MainDbContext>();让您的存储库采用一些接口db上下文,并配置StructureMap将MainDbContext注入它们.然后使StructureMap将存储库注入控制器,…
在Application_EndRequest中:
protected void Application_EndRequest() { ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); }