2011-11-03 26 views
1

不知道是否有一个“官方”的名字,但DataContext的我的意思是一个对象,透明地维护对象的状态,提供更改跟踪,语句的工作功能,并发性和可能很多其他有用的功能。 (在Entity Framework中,它是ObjectContext,在NHibernate - ISession中)。DAL:DataContext的原理的理解

最后我想出了一个想法,那就是应该在我的应用程序中实现这个功能(它使用mongodb作为后端,当我们能够跟踪某个属性更改时,mongodb的部分更新很好)。

因此,实际上,我已经得到了关于这个问题的几个问题

  1. 任何人都可以制订要求的DataContext? - 你对它的任务和责任有什么了解? (我设法找到的最相关的是Esposito的书,但不幸的是这与msdn样本级别有关)。

  2. 对于变更跟踪实施,你会有什么建议? (以最简单的方式,可以在实体中“手动”地跟踪更改,但需要编码并将dal与业务逻辑混合,所以我最感兴趣的是“自动”方式,让实体更加便宜)。

  3. 有没有办法利用一些现有的解决方案? (我希望nhibernate基础结构允许插入自定义模块与幕后的mongo一起工作,但不知道它是否允许使用非sql dbs)。

+0

获取Fowler的“企业应用程序体系结构”的副本。它详细介绍了存储库,工作单元和其他相关模式。 –

+0

对,我知道模式细节,主要是如何将所有这些抽象概念统一在“数据上下文”的范围内。 – mikalai

回答

0

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

我建议你福勒对Patterns of Enterprise Application Architecture本书中,他概述了一些持续性模式的实现。这可能有助于实施您自己的解决方案。

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

  2. 在什么方面改变跟踪,我完全同意,污染与改变事件性质等是坏的。 EF4.1中引入的最近模板之一使用Proxies来处理该模板,并提供可能的简单POCO。

+0

_introduced EF4.1 uses Proxies to handle that_ 也许你知道,是否有可能在EF环境中使用这些代理? – mikalai

+0

不幸的是我不知道。这些代理在后台完全动态创建。尝试搜索谷歌的“实体框架4.1 POCO代理”或类似的东西。 – Juri

+0

顺便说一句,也从你所说的关于记忆中的物体,我想应该有一个身份地图。还有一点我关心的是,我已经实现了几个存储库(每个实体)。你的建议是什么 - 使DataContext成为他们的门面或将存储库概括为一个类? – mikalai

0

答到quetion 2:为了让POCO类的工作,你将需要生成在运行时代码,可能使用的System.Reflection。

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

的EntityFramework还生成代码来初始化集合,因此,当有人试图做的操作,如添加和删除,集合对象本身知道该怎么做。

+0

好吧,我可以生成一个覆盖虚拟属性并跟踪更改的派生类型。不确定收藏。如果将属性/字段声明为ICollection,可能会有可能 - 只是将ICollection实现替换为字段。但是如果它被声明为List?你怎么看? – mikalai

+0

如果它是一个List,那么在使用DataContext保存更改时,必须找出哪些元素已被添加或删除,因为您必须将原始元素列表与已更改并确定哪个列表进行比较要更新,插入或删除元素的元素。 –

+0

好吧,那很简单,为什么我之前没有想过呢?谢谢) – mikalai