什么时候应该处理数据上下文
我目前正在为应用程序编写一个数据访问层。 访问层大量使用linq类来返回数据。 目前为了将数据reflection回数据库,我添加了一个私有数据上下文成员和一个公共保存方法。 代码看起来像这样:
private DataContext myDb; public static MyClass GetMyClassById(int id) { DataContext db = new DataContext(); MyClass result = (from item in db.MyClasss where item.id == id select item).Single(); result.myDb = db; return result; } public void Save() { db.SubmitChanges(); }
这是一个粗略的简化,但它提供了一般的想法。 有没有更好的方法来处理这种模式? 我应该实例化一个新的数据上下文,每次我想访问分贝?
这实际上并不重要。 我刚才问了LINQ to SQL团队的Matt Warren,这个回复是:
我们实现IDisposable有几个原因:
如果应用程序逻辑需要在DataContext预期被使用或有效的时候保存到实体上,则可以通过调用Dispose来强制执行该合同。 该实体中的延迟加载器仍将引用DataContext,并尝试在任何代码尝试导航延迟属性时使用它。 这些尝试将失败。 Dispose也强制DataContext转储其物化实体的caching,以便单个caching的实体不会意外地保持通过该DataContext物化的所有实体,否则会导致看起来像内存泄漏。
自动closuresDataContext连接的逻辑可能会导致连接断开。 DataContext依赖枚举查询的所有结果的应用程序代码,因为到达结果集的末尾会触发连接closures。 如果应用程序使用IEnumerable的MoveNext方法而不是C#或VB中的foreach语句,则可以过早退出枚举。 如果您的应用程序遇到连接未closures的问题,并且您怀疑自动closures行为不起作用,则可以使用Dispose模式作为解决方法。
但基本上你不需要在大多数情况下处理它们 – 这是devise。 无论如何,我个人更喜欢这样做,因为更容易遵循“处理所有实现IDisposable的事情”的规则,而不是记住一大堆例外情况 – 但是如果忘记处理它。
把你的datacontext视为一种资源。 而使用资源的规则说
“尽快获得资源,尽快释放资源”
DataContext是相当轻量级的,并且用于工作单元的应用程序,因为您正在使用它。 但是,我不认为我会保持DataContext在我的对象。 如果您不打算使用devise器生成的代码来pipe理业务对象,则可能需要查看存储库模式。 存储库模式将允许您处理与数据上下文分离的对象,然后在执行更新之前重新附加它们。
就我个人而言,我能够使用DBMLdevise器生成的代码来生成大部分代码,并为我的业务和validation逻辑部分实现类。 我也使devise器生成的数据上下文抽象并从中inheritance,使我可以截取直接添加到数据上下文并在其中应用业务逻辑的存储过程和表值函数方法。
我一直在ASP.NET MVC中使用的模式是注入一个工厂类,根据工作单元的需要创build适当的数据上下文。 (1)在现有的数据上下文类中使用一个包装器来模拟数据上下文(因为DataContext不容易被模拟,所以模拟包装器);(2)创build假的/模拟的上下文和工厂来创造它们。 能够从工厂随意创build它们使得我不必长时间保持一个。