存储库模式数据上下文配置在哪里?

时间:2012-06-15 12:47:40

标签: c# asp.net-mvc linq-to-sql repository-pattern

观看一些使用StoreFront等存储库模式的示例我无法确定context.Dispose()被调用的位置?难道不会处理数据上下文导致内存泄漏吗?或者它只是应用生命周期中每个产品的一个数据上下文?

3 个答案:

答案 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"))