存储库模式 数据上下文释放去哪里
本文关键字:释放 上下文 模式 数据 存储 | 更新日期: 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"))