观看一些使用StoreFront等存储库模式的示例我无法确定context.Dispose()
被调用的位置?难道不会处理数据上下文导致内存泄漏吗?或者它只是应用生命周期中每个产品的一个数据上下文?
答案 0 :(得分: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。在使用块中,对象是 只读,无法修改或重新分配。
using语句确保即使调用Dispose也会调用 在对象上调用方法时发生异常。您可以 通过将对象放在try块中来实现相同的结果 然后在finally块中调用Dispose;其实这是怎么回事 using语句由编译器翻译。代码示例 之前在编译时扩展为以下代码(请注意额外的 花括号来创建对象的有限范围):
答案 1 :(得分:1)
我认为上下文对象是指实体框架或 Linq2Sql 创建的DataContext
对象。事实上,您应该通过IDisposable
语句包装实现using
的类,或直接调用Dispose()
,但在这些数据上下文对象的情况下,这并不是真正需要的。
这是斯蒂芬·沃尔特(Stephen Walther)写的一篇优秀的post,清楚地说明了这一点。
因此,你真的没有从通话中获得任何巨大的好处 Dispose()在DataContext对象上。唯一的好处是 Dispose()方法将几个对象设置为null,以便它们可以 垃圾收集器早先收集的。除非你担心 关于您的应用程序使用的每个字节,或者您正在跟踪一个巨大的 使用DataContext的对象数量,我不会太担心 关于DataContext对象的内存开销。
答案 2 :(得分:0)
如果您使用DI,它可以为您管理物品的生命周期。以下是Ninject
中的示例kernel.Bind<ProjectAdapter.INIT1_DEVEntities>()
.ToSelf()
.InRequestScope()
.WithConstructorArgument("connectionString",
ctx => ctx.Kernel.Get<string>("efString"))