原文:[原创].NET 业务框架开发实战之八 业务层Mapping的选择策略

.NET 业务框架开发实战之八 业务层Mapping的选择策略

前言:在上一篇文章中提到了mapping,感觉很像在重新实现NHibernate。其实文章的本意是想反映出Richard在思考的时候的一些选择:利用现有的,还是最后自己用别的方式实现。如果一上来就说什么什么好,那太武断了,也很片面,系列文章反复的在强调一点:技术有它的适用场景,没有完美的技术。很多的朋友说本系列在近似的开发一个ORM,其实不是:ORM就是把数据库表转为数据实体,但是本篇中是使用已经转换后的数据实体。是把数据实体的数据给业务类。

而且本篇讨论业务类中的mapping,也就是数据的获取方式,当然,业务类的设计远远不止这些。

开始之前希望在这下面的两点上达到共识:

1.  最好不要把DAL的数据实体(Linq或者Entity Framework生成的),或者原生的DataTable暴露给UI那边(除非一定要,或者有特殊的原因)。

2.  UI使用的是BLL类(或者基于消息的Scheme格式)。

今天的议题如下:

1.第二种Mapping方法。

2.第三种Mapping方法。

  系列文章链接:

[原创].NET 分布式架构开发实战之一 故事起源

[原创].NET 分布式架构开发实战之二 草稿设计

[原创].NET 分布式架构开发实战之三 数据访问深入一点的思考

[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)

[原创].NET 分布式架构开发实战五 Framework改进篇

[原创].NET 业务框架开发实战之六 DAL的重构

[原创].NET 业务框架开发实战之七 业务层初步构想

[原创].NET 业务框架开发实战之八 业务层Mapping的选择策略

[原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略

[原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(前篇)

[原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)

1. 第二种Mapping方法。

Richard思考了配置文件的方式,诚然用配置文件确实灵活,但是灵活也是有代价的,因为Framework最后还得公司的开发人员使用,过多的配置和过高的学习成本使得Framework失去了很大的意义。

Richard开始思考了,想到了还有一种最简单的mapping的方式:就是直接一个个的赋值,如:

代码

       public class ProductBL
       {
         public string ProductName { get; set; }
         public decimal Price { get; set; }
         public string Description { get; set; }

         public void Mapping(m_Product productEntity)
         {
            this.ProductName = productEntity.Name;
            this.Price = productEntity.Price;
            this.Description = productEntity.Description;
         }
        }

  很明显,这个过程很简单却很繁琐。

  和之前使用配置文件的方式相比:

  优点:1. 便于使用和理解

       2. 便于调试

  缺点:1. 和数据实体耦合的很紧(其实这不算是缺点,这是和之前配置文件的方式比较而言认为缺点)。上面的代码中就直接使用了m_Product.(大家可以参看之一篇文章中用配置文件的优缺点)

2. 编写的过程很繁琐。全部是手动的mapping。

  而且还有关键的一点就是:查询对象怎么生成最终的SQL语句?

  例如,下面的代码:

ICriteria condition=CriteriaFactory.Create(typeof(ProductBL).Where("ProductName", Operation.Equal,"book");

如果采用配置文件的mapping方式,很清楚:在配置文件中ProductBL的ProductName对应m_Product实体的Name字段,也就是对应数据库表m_Product的Name字段(因为在BLL中使用的是通过linq或者Entity Framework生成的m_Product实体)。上面的查询对象最后生成类似select * from m_Product where Name=’book的语句。

 

      Richard想到NHibernate的实现:在NHibernate也有查询对象,在NHibernate中的查询对象的实现也是依赖NHibernate的那个mapping的配置文件的。

并不是说没有查询对象就不行,不用查询对象,用Linq和Entity Framework也是可以实现的。但是数据层就没有“以不变应万变”了的效果,而且开发人员要掌握各种的数据访问技术:ADO.NET, Linq等。(可以参看.NET 分布式架构开发实战之三 数据访问深入一点的思考一文)。

现在Richard面临的问题就是:

1. 不用配置文件mapping,这样查询对象就不好实现。

2. 手动的敲入代码mapping,重复的劳动。

Richard思考是否更好的方式解决上面的问题。于是第三种方式就产生了。

3. 第三种Mapping方法。

第三种mapping的方法就是综合了之前两种mapping的优点,而避开了他们的缺点。

Richard想到解决手动mapping的方法就是:图形化的代码生成来代替手写代码。而且要想办法保存数据库字段的一些信息。

很巧的就是:linq和EF生成的实体中的字段信息就反映了数据表字段的信息。这点可以利用起来。下面的草图是用Visio画出的,代表了Richard的想法。其实Richard也没有一下就开发出下面的工具,一切还是处于设计阶段。

Richard设计出了自动生成代码的工具(工具的开发Richard思考过了,可以采用最简单的实现方式:一个Windows程序。也想过用DSL工具开发,但是DSL得学习过程还是有点复杂的)。

:虽然说是代码生成工具,其实一开始Richard也是想的很简单:就是一个写文本的操作。

在上面的界面中,选择要和哪个数据实体类mapping,可以通过选择“MappingName”来实现。然后点击“Properties”按钮,出现了如下的界面:

 

  这是一个专门用来配置mapping的界面:点击“Add”按钮,添加一个业务类的属性,然后用”MappingTo”来设置这个属性的数据从数据实体类的那个字段中获取。在选择数据实体字段的时候,也把这个选中数据实体的字段信息保存起来,供给之后的查询对象使用。

基本思路Richard已经有了。现在的问题就是把上面选选中数据字段信息保存在哪里,而且还得和业务类的属性对应,例如,Id对应业务类Product的ProductId,而不是其他的属性。

在mapping的时候,一般是在业务类中定义一个属性,然后赋值:

  public string ProductId { get; set; }
  this.ProductName = productEntity.Id;

为了保存数据实体字段的信息,业务类的属性声明就改为下面了:

代码

public static readonly PropertyInfo<int> ProductIdProperty = RegisterProperty(
      typeof(Product),
      new PropertyInfo<int>("ProductId",typeof(M_Product)","Id")); 

    public string ProductId
    {
      get { return ReadProperty(ProductIdProperty); }
      set { LoadProperty(ProductIdProperty, value); }
    }

上面的代码通过生成的方式就比较方便,而且上面的属性声明还有更多其他的用途。初一看和WPF中依赖属性很像,确实思路也是从WPF借鉴而来的。这里简称“Mapping属性”。

  今天就写到这里,真是对不住大家,因为本篇写的比较的啰嗦,而且还没有写完。下篇讲述Mapping属性的实现原理和原因,就是为什么要是用ProductIdProperty那种声明方式。

  版权为小洋和博客园所有,欢迎转载,转载请标明出处给作者。

  http://www.cnblogs.com/yanyangtian

[原创].NET 业务框架开发实战之八 业务层Mapping的选择策略的更多相关文章

  1. [原创].NET 业务框架开发实战之七 业务层初步构想

    原文:[原创].NET 业务框架开发实战之七 业务层初步构想 .NET 业务框架开发实战之七 业务层初步构想 前言:本篇主要讲述如何把DAL和BLL衔接起来. 本篇议题如下: 1.       DAL ...

  2. [原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)

    原文:[原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) .NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) 前言:接着上篇来. 系列文章链接: [ ...

  3. [原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略

    原文:[原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略 .NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略 前言:之前的讨论一直关注在怎么从D ...

  4. [原创].NET 业务框架开发实战之六 DAL的重构

    原文:[原创].NET 业务框架开发实战之六 DAL的重构 .NET 业务框架开发实战之六 DAL的重构 前言:其实这个系列还是之前的".NET 分布式架构开发实战 ",之所以改了 ...

  5. [原创].NET 分布式架构开发实战五 Framework改进篇

    原文:[原创].NET 分布式架构开发实战五 Framework改进篇 .NET 分布式架构开发实战五 Framework改进篇 前言:本来打算这篇文章来写DAL的重构的,现在计划有点改变.之前的文章 ...

  6. [原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)

    原文:[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) 前言:上一篇文章讲述了一些实现DAL的理论,本 ...

  7. [原创].NET 分布式架构开发实战之三 数据访问深入一点的思考

    原文:[原创].NET 分布式架构开发实战之三 数据访问深入一点的思考 .NET 分布式架构开发实战之三 数据访问深入一点的思考 前言:首先,感谢园子里的朋友对文章的支持,感谢大家,希望本系列的文章能 ...

  8. [原创].NET 分布式架构开发实战之二 草稿设计

    原文:[原创].NET 分布式架构开发实战之二 草稿设计 .NET 分布式架构开发实战之二 草稿设计 前言:本篇之所以称为草稿设计,是因为设计的都是在纸上完成的.反映了一个思考的过程. 本篇的议题如下 ...

  9. [原创].NET 分布式架构开发实战之一 故事起源

    原文:[原创].NET 分布式架构开发实战之一 故事起源 .NET 分布式架构开发实战之一 故事起源 前言:本系列文章主要讲述一个实实在在的项目开发的过程,主要包含:提出问题,解决问题,架构设计和各个 ...

随机推荐

  1. Ipsec transport mode and turnnel mode

     隧道(tunnel)模式:用户的整个IP数据包被用来计算AH或ESP头,AH或ESP头以及ESP加密的用户数据被封装在一个新的IP数据包中.通常,隧道模式应用在两个安全网关之间的通讯. 传输(t ...

  2. 复习面向对象的OOA、OOD、OOP

    复习 OOA.OOD.OOP OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,依照面向对象的思想来分析问题. OOA与结构化 ...

  3. OpenCV 通过 MFC 的 Picture Control 控件操作图像

    假设希望对显示在MFC Picture Control 控件里的图像进行操作,比方画线画点之类的,能够利用 OpenCV 结合 MFC 本身的鼠标响应函数来实现. 怎样将图像显示到 Picture C ...

  4. openstack学习笔记一 虚拟机启动过程代码跟踪

    openstack学习笔记一 虚拟机启动过程代码跟踪 本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发 ...

  5. [Leetcode]-ReverseLinkedList

    题目:单链表取反 #include <stdlib.h> #include <stdio.h> typedef struct node *list; typedef struc ...

  6. Learning Cocos2d-x for WP8(8)——动作Action

    原文:Learning Cocos2d-x for WP8(8)--动作Action 游戏很大程度上是由动作画面支撑起来的. 动作分为两大类:瞬间动作和延时动作. 瞬间动作基本等同于设置节点的属性,延 ...

  7. 辛星分析html中间name和id 差额

    朋友们可以新手也能很容易区分id和class,但不一定很容易区分id和name,以下说一下二者的差别和联系. 首先是联系,它们都能够用来标记一个元素,并且能够用JavaScript来操作,可是操作方法 ...

  8. Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍

    原文 Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍 前言 在上一篇文章中, 我们介绍了Xamarin 以及简单的HelloWorld范例, 这次我们针对iO ...

  9. 使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表

    原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表 我们知道目标平台是32位的程序运行在64位的系统上,去访问部分注册表的时候系统自动重定向到win32node节点对应的 ...

  10. Sybase Unwired Platform(SUP) 经常使用资源整理(不断更新中)

    提示:建议刚開始学习的人看三个东西,详见以下的详细内容.然后再去看论坛,官方技术支持站点等资源. SUP移动开发平台 中文视频讲座 SUP入门讲座(Wang Jun) SUP系列学习笔记 SUP实验 ...