存储库模式 数据上下文释放去哪里

本文关键字:释放 上下文 模式 数据 存储 | 更新日期: 2023-09-27 18:37:14

看了几个使用存储库模式(如 StoreFront )的示例,我不知道context.Dispose()在哪里叫?不处理数据上下文不会导致内存泄漏吗?还是在应用程序的生存期内,每个存储库只有一个数据上下文?

存储库模式 数据上下文释放去哪里

如果您使用的是应该执行的 using 语句,则调用在实现 IDisposable 接口时会自动释放。

如:

public int GetThingCount()
{
    using (MyDataContext context = new MyDataContext())  // context is created here
    {
        return context.Things.Count();
    } // it is automatically disposed of here even in the event of an exception
}

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

通常,当您使用 IDisposable 对象时,您应该声明和 在 using 语句中实例化它。using 语句调用 以正确的方式在对象上释放方法,并且(当您使用它时) 如前所示)它还会导致对象本身超出范围 一旦调用"处置"。在 using 块中,对象是 只读,不能修改或重新分配。

using 语句确保调用 Dispose 即使 在对象上调用方法时发生异常。您可以 通过将对象放入 try 块中来获得相同的结果,并且 然后在最终块中调用处置;事实上,这就是 using 语句由编译器翻译。代码示例 较早在编译时扩展为以下代码(请注意额外的 大括号以创建对象的有限范围):

我认为上下文对象是指由实体框架Linq2Sql创建的DataContext对象。事实是,通常您应该通过using语句包装实现IDisposable的类或直接调用Dispose(),但在这些数据上下文对象的情况下,这并不是真正必需的。

这是斯蒂芬·瓦尔特(Stephen Walther)写的一篇很棒的文章,清楚地说明了这一点。

因此,您真的不会从通话中获得任何巨大的好处 Dispose() 在 DataContext 对象上。唯一轻微的好处是 Dispose() 方法将多个对象设置为 null,以便它们可以 之前由垃圾回收器收集。除非你担心 关于您的应用程序使用的每个字节,或者您正在跟踪一个巨大的 使用您的数据上下文的对象数量,我不会太担心 关于 DataContext 对象的内存开销。

如果您使用的是 DI,它可以为您管理项目的生命周期。这是Ninject中的一个例子

kernel.Bind<ProjectAdapter.INIT1_DEVEntities>()
              .ToSelf()
              .InRequestScope()
              .WithConstructorArgument("connectionString",
            ctx => ctx.Kernel.Get<string>("efString"))