看了几个使用存储库模式(如 StoreFront)的示例,我不知道在哪里context.Dispose()
调用?不处理数据上下文不会导致内存泄漏吗?或者它只是应用程序生命周期中每个存储库的一个数据上下文?
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 语句的方式。前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围):
我认为上下文对象是指DataContext
由Entity Framework或Linq2Sql创建的对象。事实通常是您应该包装IDisposable
通过using
语句实现的类或Dispose()
直接调用,但在这些数据上下文对象的情况下,这并不是真正需要的。
这是 Stephen Walther 写的一篇出色的文章,清楚地说明了这一点。
因此,在 DataContext 对象上调用 Dispose() 并没有真正获得任何巨大的好处。唯一的一点好处是 Dispose() 方法将几个对象设置为 null,以便垃圾收集器可以更早地收集它们。除非您担心应用程序使用的每个字节,或者您正在使用 DataContext 跟踪大量对象,否则我不会过多担心 DataContext 对象的内存开销。
如果您使用 DI,它可以为您管理项目的生命周期。这是Ninject中的一个示例
kernel.Bind<ProjectAdapter.INIT1_DEVEntities>()
.ToSelf()
.InRequestScope()
.WithConstructorArgument("connectionString",
ctx => ctx.Kernel.Get<string>("efString"))