使用HttpContextScoped()时,StructureMap不处理数据上下文

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)


PHe*_*erg 5

使用嵌套容器是使Structure Map自动处理对象的唯一方法.如果您不使用该技术,唯一的方法是使用OP描述的方式自己处理对象(从容器中拉出对象并将其丢弃;请参阅此NHibernate示例以了解其中一种方法)或范围反对HttpRequest并调用ReleaseAndDisposeAllHttpScopedObjects,如Darin所述.