dev*_*xer 10 structuremap asp.net asp.net-mvc httpcontext
我的目标是MainDbContext在ASP.NET MVC中为每个HTTP请求提供一个数据上下文(),并在请求结束时处理数据上下文.
我正在使用以下StructureMap配置:
public static class ContainerConfigurer
{
public static void Configure()
{
ObjectFactory.Initialize(x =>
{
x.For<MainDbContext>().HttpContextScoped();
});
}
}
Run Code Online (Sandbox Code Playgroud)
每当我需要时MainDbContext,我都在使用这段代码:
var dbContext = ObjectFactory.GetInstance<MainDbContext>();
Run Code Online (Sandbox Code Playgroud)
这是按预期工作的:每个HTTP请求只创建一个数据上下文.问题是,MainDbContext在请求结束时没有处理.
如何在HTTP请求完成时配置我的ObjectFactory来处理数据上下文?或者这只是我需要Application_EndRequest()在Global.asax中手动使用的东西.
更新
我刚刚尝试将以下代码添加到Global.asax:
protected virtual void Application_EndRequest()
{
ObjectFactory.GetInstance<MainDbContext>().Dispose();
}
Run Code Online (Sandbox Code Playgroud)
正如所料,这解决了这个问题.我仍然想知道是否有任何方法可以使用StructureMap自动执行此操作.
Dar*_*rov 10
代替:
x.For<MainDbContext>().HttpContextScoped();
Run Code Online (Sandbox Code Playgroud)
尝试:
x.For<MainDbContext>().HttpContextScoped().Use(() => new MainDbContext());
Run Code Online (Sandbox Code Playgroud)
通常它也是需要db上下文的存储库类.因此,不要ObjectFactory.GetInstance<MainDbContext>();让你的存储库采用一些接口db上下文并配置StructureMap来注入MainDbContext它们.然后使StructureMap将存储库注入控制器,...
在Application_EndRequest:
protected void Application_EndRequest()
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}
Run Code Online (Sandbox Code Playgroud)
使用嵌套容器是使Structure Map自动处理对象的唯一方法.如果您不使用该技术,唯一的方法是使用OP描述的方式自己处理对象(从容器中拉出对象并将其丢弃;请参阅此NHibernate示例以了解其中一种方法)或范围反对HttpRequest并调用ReleaseAndDisposeAllHttpScopedObjects,如Darin所述.
| 归档时间: |
|
| 查看次数: |
4266 次 |
| 最近记录: |