2010-09-03 110 views
0

应用程序使用ADO.NET为几乎每个数据库操作调用sprocs。其中一些sprocs也包含相当数量的域逻辑。每个域实体的数据访问逻辑驻留在域类本身中。即域逻辑和数据访问逻辑之间没有解耦。如何从现有的ADO.NET持久性逻辑中逐渐过渡到NHibernate持久性逻辑?

我期待完成以下任务:

  • 从数据访问逻辑分离的域逻辑
  • 让域模型持久无知
  • 逐步实现跨版本过渡到NHibernate的,重构DAL的单独部分(如果你可以这样称呼的话)

这里是我的将单个类过渡到NHibernate的方法p ersistence

  1. 创建域类
  2. 的映射创建域类的储存库(基本CRUD操作从一个普通的碱库继承)
  3. 在由所使用的存储库用于每个存储过程创建一个方法老DAL(做一些重构一起拉出域逻辑的方式)
  4. 修改消费者使用的存储库,而不是数据访问逻辑类本身
  5. 删除旧数据访问逻辑和存储过程

我遇到的问题是#1和#4。 (#1)如何映射没有NHibernate映射的类型的属性?

考虑具有Address属性的Person类(Address是没有NH映射的域对象,Person是我映射的类)。如何在人员映射中包含地址而不创建地址的整个映射? (#4)在转换过程中,如何管理旧数据访问逻辑的依赖关系?

域模型中的类利用我期望删除的旧数据访问逻辑。考虑具有CustomerId属性的Order类。当Order需要客户信息时,它调用驻留在Customer类中的ADO.NET数据访问逻辑。除非维护旧的数据访问逻辑,除非依赖类自己映射,否则还有哪些选项?

回答

1

我将接近这样的:

  1. 重构和移动数据访问逻辑走出域类的到数据层。
  2. 重构并将域逻辑从sprocs移出到数据层。 (这一步是可选的,但这样做肯定会使转换更加顺畅和容易。)
  3. 您不需要存储库,但是您可以创建一个存储库(如果需要)。
  4. 为每个域类创建一个NHibernate映射(有这样的工具)。
  5. 创建一个面向NHibernate的数据访问API,它可以缓慢地替换存储区数据层。

步骤1 & 2是最难的部分,因为它听起来像你有紧密的耦合,理想情况下永远不会发生。这两个步骤都不涉及NHibernate。在尝试更换数据层之前,您正在严格转向更易维护的体系结构。

尽管可能会逐个创建NHibernate映射,并在没有完整对象图的情况下利用它们,这似乎是在寻求不必要的痛苦。如果你选择这条路,你需要非常谨慎地行事,我不会推荐它。为此,可以将外键映射为纯int/guid而不是与另一个域类的关系,但必须非常小心,不要以这种方式向NHibernate提交一半数据,从而损坏数据。自动化的单元/集成测试是你的朋友。

交换数据层很困难。如果你有一个可靠的最低公分母数据层架构,那么这会更容易,但我实际上并不推荐使用最低公分母方法来创建架构。松耦合是好的,但你可以走得太远。

0

在因特网上搜索的nhibernate电子书

  1. 重构和移动数据访问逻辑走出域类的到数据层上更多。
  2. 重构并将域逻辑从sprocs移出到数据层。 (这一步是可选的,但这样做肯定会使转换更加顺畅和容易。)
  3. 您不需要存储库,但是您可以创建一个存储库(如果需要)。
  4. 为每个域类创建一个NHibernate映射(有这样的工具)。
  5. 创建一个面向NHibernate的数据访问API,用于缓慢地替换存储数据层