Spring.NET IOC / MVC - 处理的数据库上下文

时间:2012-06-24 08:43:57

标签: c# asp.net-mvc inversion-of-control spring.net

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

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

我已经搭建了控制器,默认情况下它们实现了IDisposable接口,其中配置了数据库连接 - 如下所示:

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

那很好 - 我想保持这样。但是,调用的第二个控制器会给出一个异常,说明数据库上下文已被释放。

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

2 个答案:

答案 0 :(得分:1)

默认情况下,spring.net Web应用程序容器中配置的对象具有"application" scope。这意味着您的实例名为DatabaseContext创建一次 - 在Web应用程序启动时。第一个使用此实例的控制器,处理它,然后它不能被任何其他控制器使用。

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

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

问题IoC (spring.net) with asp.net - ctor injected non-singleton objects on controller - where do I dispose?最近出现了;你也可能对此感兴趣。

答案 1 :(得分:0)

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

将其更改为基于实例的IDBContext