如何从现有的ADO.NET持久性逻辑逐步过渡到NHibernate持久性逻辑?

时间:2010-09-03 18:34:39

标签: vb.net nhibernate ado.net

应用程序使用ADO.NET为几乎每个数据库操作调用sprocs。其中一些sprocs也包含相当数量的域逻辑。每个域实体的数据访问逻辑驻留在域类本身中。即,域逻辑和数据访问逻辑之间没有解耦。

我希望完成以下任务:

  • 将域逻辑与数据访问逻辑分离
  • 使域模型持久性无知
  • 逐个版本逐步实现向NHibernate的过渡,一次重构DAL的各个部分(如果可以这样称呼的话)

这是我将单个类转换为NHibernate持久性的方法

  1. 为域类创建映射
  2. 为域类创建存储库(从通用基础存储库继承的基本CRUD操作)
  3. 在存储库中为旧DAL使用的每个sproc创建一个方法(在拉出域逻辑的过程中进行一些重构)
  4. 修改使用者以使用存储库而不是类本身中的数据访问逻辑
  5. 删除旧数据访问逻辑和sprocs
  6. 我遇到的问题是#1和#4。

    (#1)如何映射没有NHibernate映射的类型的属性?

    考虑具有Address属性的Person类(Address是没有NH映射的域对象,Person是我正在映射的类)。如何在Person映射中包含Address而不为Address创建整个映射?

    (#4)在过渡期间如何管理旧数据访问逻辑的依赖?

    域模型中的类使用我想要删除的旧数据访问逻辑。考虑具有CustomerId属性的Order类。当订单需要客户信息时,它会调用驻留在Customer类中的ADO.NET数据访问逻辑。除了依赖类本身映射之前,还有哪些选项可以维护旧的数据访问逻辑?

2 个答案:

答案 0 :(得分:1)

我会这样做:

  1. 重构并将数据访问逻辑从域类移出到数据层中。
  2. 重构并将域逻辑移出sprocs到数据层。 (这一步是可选的,但这样做肯定会使过渡变得更加顺畅和容易。)
  3. 您不需要存储库,但如果需要,您当然可以创建存储库。
  4. 为每个域类创建一个NHibernate映射(有工具可以执行此操作)。
  5. 创建面向NHibernate的数据访问API,慢慢替换sproc数据层。
  6. 步骤1& 2是最难的部分,因为它听起来像你有紧耦合,理想情况下永远不会发生。前两个步骤都没有涉及NHibernate。在尝试更换数据层之前,您正在严格转向更易于维护的体系结构。

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

    交换数据层很难。如果你有一个坚实的最小公分母数据层架构会更容易,但我实际上不建议使用最小公分母方法创建架构。松耦合很好,但你可以走得太远。

答案 1 :(得分:0)

在互联网上搜索更多关于nhibernate电子书的信息

  1. 重构并将数据访问逻辑从域类移出到数据层中。
  2. 重构并将域逻辑移出sprocs到数据层。 (这一步是可选的,但这样做肯定会使过渡变得更加顺畅和容易。)
  3. 您不需要存储库,但如果需要,您当然可以创建存储库。
  4. 为每个域类创建一个NHibernate映射(有工具可以执行此操作)。
  5. 创建面向NHibernate的数据访问API,慢慢替换sproc数据层