asp.net – 当使用HttpContextScoped()时,StructureMap不会处理数据上下文

前端之家收集整理的这篇文章主要介绍了asp.net – 当使用HttpContextScoped()时,StructureMap不会处理数据上下文前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的目标是在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自动执行.

解决方法

代替:
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();
}

猜你在找的asp.Net相关文章