加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 当使用HttpContextScoped()时,StructureMap不会处理

发布时间:2020-12-15 19:15:55 所属栏目:asp.Net 来源:网络整理
导读:我的目标是在ASP.NET MVC中根据HTTP请求拥有一个数据上下文(MainDbContext),并在请求结束时处理数据上下文. 我使用以下StructureMap配置: public static class ContainerConfigurer{ public static void Configure() { ObjectFactory.Initialize(x = { x.Fo
我的目标是在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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读