我的目标是在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();
- }