4

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

4

3 回答 3

3

如果您正在使用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 语句以正确的方式调用对象的 Dispose 方法,并且(当您如前所示使用它时)它还会导致对象本身在调用 Dispose 时立即超出范围。在 using 块中,对象是只读的,不能修改或重新分配。

using 语句可确保调用 Dispose,即使在调用对象上的方法时发生异常也是如此。您可以通过将对象放在 try 块中,然后在 finally 块中调用 Dispose 来获得相同的结果;事实上,这就是编译器翻译 using 语句的方式。前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围):

于 2012-06-15T12:50:31.903 回答
1

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

这是 Stephen Walther 写的一篇出色的文章,清楚地说明了这一点。

因此,在 DataContext 对象上调用 Dispose() 并没有真正获得任何巨大的好处。唯一的一点好处是 Dispose() 方法将几个对象设置为 null,以便垃圾收集器可以更早地收集它们。除非您担心应用程序使用的每个字节,或者您正在使用 DataContext 跟踪大量对象,否则我不会过多担心 DataContext 对象的内存开销。

于 2012-06-15T13:13:53.350 回答
0

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

kernel.Bind<ProjectAdapter.INIT1_DEVEntities>()
              .ToSelf()
              .InRequestScope()
              .WithConstructorArgument("connectionString",
            ctx => ctx.Kernel.Get<string>("efString"))
于 2012-06-15T13:15:48.627 回答