个人感觉数据访问层,设计上应该可以更精简。

现有的框架是一个DAL,对应一个Helper(我们可以理解其实就是真正的数据引擎)。这种方式实现上确实很简单,但是有重复的地方。对于每种DAL,不同的只是Helper,其它实现基本相同。

一个可行的重构,实现一个真正的Helper类,把不同的数据引擎,封装为一个DALEngine, 一些简单的代码实现,可以参见如下:
public interface IDALEngine
{
    int ExecuteNonQuery(CommandType cmdType, String cmdText, IList<IParameter> parameters);
    object ExecuteNonScalar(CommandType cmdType, String cmdText, IList<IParameter> parameters);
    IDataReader ExecuteReader(CommandType cmdType, String cmdText, IList<IParameter> parameters);
}

public abstract class DALHelper
{
    public static int ExecuteNonQuery(IDALEngine engine, CommandType cmdType, String cmdText, IList<IParameter> parameters)
    {
        return engine.ExecuteNonQuery(cmdType, cmdText, parameters);
    }

public static object ExecuteNonScalar(IDALEngine engine, CommandType cmdType, String cmdText, IList<IParameter> parameters)
    {
        return engine.ExecuteNonScalar(cmdType, cmdText, parameters);
    }

public static IDataReader ExecuteReader(IDALEngine engine, CommandType cmdType, String cmdText, IList<IParameter> parameters)
    {
        return engine.ExecuteReader(cmdType, cmdText, parameters);
    }
}

public class SqlDALEngine : IDALEngine
{
    private SqlConnection conn;
    public SqlDALEngine(String connString)
    {
        conn = new SqlConnection(connString);
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }
    }
    int ExecuteNonQuery(CommandType cmdType, String cmdText, IList<IParameter> parameters)
    {
        if (conn.State != ConnectionState.Open)
        {
            //throw exception: connection is closed!
        }

SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandType = cmdType;
        cmd.CommandText = cmdText;
        
        if (parameters != NULL)
        {
            foreach (IParameter param in parameters)
            {
                cmd.Parameters.Add(param);  //也许需要进行一些转换,这里只是一个伪代码
            }
        }

int result = cmd.ExecuteNonQuery();
        
        return result;
    }

object ExecuteNonScalar(CommandType cmdType, String cmdText, IList<IParameter> parameters)
    {
        //参考实现如ExecuteNonQuery
    }

IDataReader ExecuteReader(CommandType cmdType, String cmdText, IList<IParameter> parameters)
    {
        //参考实现如ExecuteNonQuery
    }  
}

看起来这只是一个简单的转换,但在大型系统,表格极多的情况下,绝对是一大改善。

另外,原有的数据访问层框架,如果在数据没有准备好的情况下,不便于测试,通过这种改善,我们可以把数据访问及数据访问引擎给进行隔离,各自发展

欢迎大家参与讨论,谢绝人身攻击!

转载于:https://www.cnblogs.com/richardy2012/archive/2012/11/15/2771741.html

PetShop 4.0 数据访问层之我所见相关推荐

  1. petshop4.0 详解之三(PetShop数据访问层之消息处理) [转]

    三.PetShop数据访问层之消息处理 在进行系统设计时,除了对安全.事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量.数据流量.服务器 ...

  2. Microsoft PetShop 3.0 设计与实现 分析报告―――数据访问层

    Microsoft PetShop 3.0 设计与实现--数据访问层 最近对多层设计实现和.Net产生了兴趣,从而研究了一下比较著名的多层范例程序――PetShop,现在的版本是3.0,和以前的版本从 ...

  3. petshop4.0 详解之二(数据访问层之数据库访问设计)

    在系列一中,我从整体上分析了PetShop的架构设计,并提及了分层的概念.从本部分开始,我将依次对各层进行代码级的分析,以求获得更加细致而深入的理解.在PetShop 4.0中,由于引入了ASP.Ne ...

  4. [wayfarer]PetShop数据访问层之消息处理

    原文地址: http://www.cnblogs.com/wayfarer/archive/2006/09/06/496207.html <解剖PetShop>系列之三 三.PetShop ...

  5. [wayfarer]PetShop数据访问层之数据库访问设计

    原文地址: http://www.cnblogs.com/wayfarer/archive/2006/04/21/381315.html <解剖PetShop>系列之二 二.PetShop ...

  6. Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层

    原文 | 下载本教程中的编码例子 | 下载本教程的英文PDF版 导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研 ...

  7. NHibernate3.2+Asp.net MVC3+Extjs 4.0.2项目实践(二): NHibernate数据访问层实现

    关于NHibernate的ORM映射可以通过Hbm映射文件来完成,代码生成工具使得这一步骤变得简化:而NHibernate3.2版本集成Mapping-By-Code(代码映射),不同于其他映射方式, ...

  8. PP团队圣经巨著《Application Architecture Guide2.0》14章-数据访问层

    第十四章 数据访问层指导 概览 这一章主要描述设计数据访问层时要注意的主要原则.它们覆盖了设计数据访问层遇到的通常问题及错误.下面的图表展示了数据层怎样嵌入一个通用的应用架构. (cnblog我的图片 ...

  9. Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 3 ----数据访问层

    在上一篇中,我们已经搭建起了整个解决方案的项目,并且建好了数据库,完成了实体类和Nhibernate映射文件.在本文中,将定义数据访问接口,并利用Nhibernate实现接口,利用Spring.net ...

最新文章

  1. Node Opencv Addon
  2. 高校数字化建设到底该如何推进?这篇方案值得一看
  3. 安川伺服总线通讯方式_MⅢ总线特点 安川伺服选型与应用案例
  4. 【HDU - 2030 】汉字统计 (C语言汉字编码,长知识)
  5. python3兼容python2 print_python 字符串 r raw Python2 和 Python3 的区别及兼容技巧
  6. sql语句优化之一:尽量使用索引避免全表扫描
  7. Linux学习笔记003----linux yum命令详解
  8. 程序员很少加班?得全栈开发者得天下?撕开标签的技术圈真实模样
  9. [转]asp 没有权限: 'CreateObject'的解决方法
  10. 【原】机器学习几个基本的问题
  11. 管家婆系统怎么创建提醒服务器,管家婆辉煌Ⅱ++10.1 -管家婆软件官方网站
  12. PX PT 磅 EM 以及PS中字间距VA单位的解释
  13. RabbitMQ使用手册中文
  14. html5 3d背景墙,3D背景墙的价格怎样?3D背景墙的介绍?
  15. 收藏夹导出至html,分享win7电脑中三种导出浏览器收藏夹地址方法
  16. 阿里高层大调整:“接班人”蒋凡被调离核心业务淘宝天猫!
  17. ARCGIS地图导出问题
  18. 模糊系统与神经网络的区别,什么是模糊神经网络
  19. Ego的JavaSE笔记
  20. python画老虎_老虎证券量化API Python SDK

热门文章

  1. 伯克利AI研究院解析「反向课程学习」,改善「强化学习智能体」并应用于机器人技术
  2. Facebook 重金挖不到,ASP.NET 之父,微软大神“红衣教主”传奇
  3. 新外贸110%加速度,阿里巴巴国际站力推百亿投资计划
  4. 美团、饿了么,你凭什么让我多等几分钟?
  5. 现代 JavaScript 函数库 usuallyjs 的安装和使用
  6. 胡玮炜卸任摩拜CEO,或将成为美团大裁员的开端
  7. Linux学习笔记(十二)usermod、passwd、mkpasswd
  8. 这可能是最好的性能优化教程(三)
  9. Python高级特性——切片(Slice)
  10. Android SharedPreferences保存和读取对象