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

时间:2011-06-17 19:07:57

标签: asp.net asp.net-mvc structuremap httpcontext

我的目标是在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。

2 个答案:

答案 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所述。