1

我在我的 ASP.NET MVC 4 应用程序中使用 Spring.NET 的 IOC 容器。每个控制器都从容器中获取 EF 数据上下文:

    private readonly IDBContext db =
        (IDBContext) ApplicationHelper.ApplicationContext.GetObject("DatabaseContext");

我已经为控制器搭建了脚手架,默认情况下它们实现了 IDisposable 接口,其中设置了 DB 连接 - 如下所示:

    protected override void Dispose(bool disposing)
    {
        this.db.Dispose();
        base.Dispose(disposing);
    }

没关系 - 我想保持这种状态。但是,被调用的第二个控制器给出了一个异常,说明数据库上下文已被释放。

所以 - 我想做的是让 IOC 容器在下一个控制器调用该GetObject()方法时检查对象是否已被释放。这可能吗,还是我应该改变我的设计?

4

2 回答 2

1

默认情况下,在您的 spring.net Web 应用程序容器中配置的对象具有“应用程序”范围。这意味着您命名的实例DatabaseContext只在 Web 应用程序启动时创建一次。使用此实例的第一个控制器将其释放,此后任何其他控制器都无法使用它。

通常,在使用 IOC 容器时,像在控制器中使用 dispose 实现那样自己管理对象生命周期是不好的做法。如果可能,您应该让容器管理对象的生命周期。

DatabaseContext在这种特殊情况下,创建使用request范围可能很有意义。这样做时,弹簧容器将DatabaseContext在您的请求结束时处理您。执行此操作时,您可以删除this.db.Dispose(); from Controller.Dispose

问题IoC (spring.net) with asp.net - ctor 在控制器上注入了非单例对象 - 我在哪里处理?最近来了;你可能也会感兴趣。

于 2012-06-24T10:58:16.913 回答
0

看起来在您的 IoC 容器设置方法中,您配置IDBContext为单例。

将其更改为基于实例的IDBContext.

于 2012-06-24T09:42:13.643 回答