DAL:DataContext原理的理解

时间:2011-11-03 22:06:18

标签: c# architecture orm data-access-layer

不确定是否存在“官方”名称,但是DataContext是指透明地维护对象状态的对象,提供更改跟踪,工作声明功能,并发性以及可能的许多其他有用功能。 (在Entity Framework中,它是ObjectContext,在NHibernate中 - ISession)。

最终我认为应该在我的应用程序中实现类似的东西(它使用mongodb作为后端,当我们能够跟踪某个属性更改时,mongodb的部分更新很好)。 / p>

实际上,我在这个问题上有几个问题

  1. 有人可以为DataContext制定要求吗? - 您对它的任务和责任的理解是什么? (我找到的最相关的是Esposito的书,但不幸的是,这是关于msdn样本水平的。)

  2. 您对跟踪实施的变更有何建议? (以最简单的方式,可以在实体中“手动”跟踪更改,但需要编码并将dal与业务逻辑混合,因此我最感兴趣的是“自动”方式,保持实体更多poco)。

  3. 有没有办法利用现有的解决方案? (我希望nhibernate基础设施允许插件自定义模块在场景后面使用mongo,但不确定它是否允许使用非sql dbs。)

2 个答案:

答案 0 :(得分:0)

对问题2的回答:要使POCO类工作,您需要在运行时生成代码,可能使用System.Reflection。

如果您分析EntityFramework,您将看到它需要虚拟属性来进行更改跟踪...这是因为它需要在运行时创建一个生成的类,它会覆盖每个属性,然后添加代码来告诉有人更改该属性时的DataContext。

EntityFramework还会生成初始化集合的代码,这样当有人尝试执行添加和删除等操作时,集合对象本身就知道该怎么做。

答案 1 :(得分:0)

DataContext(EF中的ObjectContext或DbContext)只不过是Unit of Work (UoW) / Repository模式的实现。

我建议您阅读Fowler关于Patterns of Enterprise Application Architecture的书,其中概述了几种持久性模式的实现。这可能有助于实施您自己的解决方案。

  1. DataContext基本上需要完成UoW的工作。它需要处理对给定生命周期(即HTTP请求)中涉及的对象的读取和管理,s。内存中没有两个对象代表DB上的相同记录。此外,它需要提供一些更改跟踪,以便对数据库执行部分更新(如您所述)。

  2. 关于更改跟踪,我完全同意使用更改事件等污染属性是不好的。 EF4.1中引入的最新模板之一使用Proxies来处理它并提供普通POCO的可能性。