【问题标题】:DAL: DataContext principles understandingDAL:DataContext原理理解
【发布时间】:2011-12-21 14:19:33
【问题描述】:

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

最终我想到应该在我的应用程序中实现类似的东西(它使用 mongodb 作为后端,当我们能够跟踪某个属性更改时,mongodb 的部分更新就可以了)。

所以实际上,我有几个关于这个主题的问题

  1. 谁能制定对 DataContext 的要求? - 你对它的任务和责任有什么理解? (我设法找到的最相关的是 Esposito 的书,但不幸的是,这大约是 msdn 样本级别)。

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

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

【问题讨论】:

  • 获取 Fowler 的“企业应用架构模式”的副本。它详细介绍了存储库、工作单元和其他相关模式。
  • 对,我知道模式细节,主要是如何在“数据上下文”范围内统一所有这些抽象。

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


【解决方案1】:

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

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

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

【讨论】:

  • 好的,所以我可以生成一个派生类型,它会覆盖虚拟属性并跟踪更改。不确定收藏。可能,如果将属性/字段声明为 ICollection - 只需用我的 ICollection 实现替换字段即可。但是如果它被声明为 List 呢?你怎么看?
  • 如果它是一个列表,那么您必须在使用 DataContext 保存更改时找出添加或删除的元素,因为您必须将原始元素列表与已更改的列表并确定要更新、插入或删除该元素的元素。
  • 嗯..这很容易,为什么我以前没有考虑过呢?谢谢)
【解决方案2】:

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

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

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

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

【讨论】:

  • 在 EF4.1 中引入使用代理来处理这个问题 也许你知道,是否可以在 EF 环境之外使用这些代理?
  • 不幸的是我不知道。这些代理是完全在幕后动态创建的。尝试在 Google 上搜索“Entity Framework 4.1 POCO Proxies”或类似内容。
  • 顺便说一句,同样从你所说的关于内存中的对象,我想也应该有一个身份映射。我还担心的是,我已经实现了几个存储库(每个实体)。您的建议是什么 - 让 DataContext 成为他们的门面或将存储库概括为一个类?
  • 当然,身份映射也可能是一个问题。尝试查看工作单元模式。我强烈向您推荐我建议的 PoEAA 书。它很好地概述了所有这些持久性和架构问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
相关资源
最近更新 更多