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

发布于 2024-11-16 03:26:17 字数 987 浏览 2 评论 0原文

我的目标是在 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 没有在请求结束时被释放。

如何配置 ObjectFactory 以在 HTTP 请求完成时处理数据上下文?或者这只是我需要使用 Global.asax 中的 Application_EndRequest() 手动执行的操作。

更新

我刚刚尝试将以下代码添加到 Global.asax:

protected virtual void Application_EndRequest()
{
    ObjectFactory.GetInstance<MainDbContext>().Dispose();
}

正如预期的那样,这解决了问题。然而,我仍然想知道是否有任何方法可以使用 StructureMap 自动执行此操作。

My goal is to have one data context (MainDbContext) per HTTP request in ASP.NET MVC and dispose the data context when the request ends.

I'm using the following StructureMap configuration:

public static class ContainerConfigurer
{
    public static void Configure()
    {
        ObjectFactory.Initialize(x =>
        {
            x.For<MainDbContext>().HttpContextScoped();
        });
    }
}

Whenever I need a MainDbContext, I'm using this code:

var dbContext = ObjectFactory.GetInstance<MainDbContext>();

This is working as expected: only one data context is being created per HTTP request. The problem is, MainDbContext is not being disposed at the end of the request.

How can I configure my ObjectFactory to dispose the data context when the HTTP request finishes? Or is this just something I need to do manually using Application_EndRequest() in Global.asax.

Update

I just tried adding the following code to Global.asax:

protected virtual void Application_EndRequest()
{
    ObjectFactory.GetInstance<MainDbContext>().Dispose();
}

As expected, this solves the problem. I'm still wondering if there's any way to do this automatically with StructureMap, however.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丑疤怪 2024-11-23 03:26:17

而不是:

x.For<MainDbContext>().HttpContextScoped();

尝试:

x.For<MainDbContext>().HttpContextScoped().Use(() => new MainDbContext());

通常情况下,存储库类需要数据库上下文。因此,您的存储库不需要使用 ObjectFactory.GetInstance(); 来获取一些接口数据库上下文,并配置 StructureMap 将 MainDbContext 注入其中。然后使 StructureMap 将存储库注入控制器,...

Application_EndRequest 中:

protected void Application_EndRequest()
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

Instead of:

x.For<MainDbContext>().HttpContextScoped();

Try:

x.For<MainDbContext>().HttpContextScoped().Use(() => new MainDbContext());

Also normally it's repository classes that need a db context. So instead of ObjectFactory.GetInstance<MainDbContext>(); have your repositories take some interface db context and configure StructureMap to inject the MainDbContext into them. Then make StructureMap inject repositories into controllers, ...

In Application_EndRequest:

protected void Application_EndRequest()
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}
Spring初心 2024-11-23 03:26:17

使用嵌套容器是唯一的方法获取结构图来自动处理对象。如果您不使用该技术,唯一的方法是使用OP描述的方式自行处置对象(从容器中拉出对象并处置它;请参阅此NHibernate 示例 了解一种方法)或将对象范围限定为 HttpRequest 并调用正如 Darin 所描述的那样,ReleaseAndDisposeAllHttpScopedObjects。

Using a nested container is the only way to get Structure Map to automatically dispose objects. If you're not using that technique the only way is to dispose the objects yourself using either the way the OP described (pulling the object from the container and disposing it; see this NHibernate example for one way to do it) or to scope the object to HttpRequest and call ReleaseAndDisposeAllHttpScopedObjects as Darin described.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文