博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PetShop 4.0 数据访问层之我所见
阅读量:6571 次
发布时间:2019-06-24

本文共 2194 字,大约阅读时间需要 7 分钟。

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

现有的框架是一个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

你可能感兴趣的文章
期末大作业
查看>>
[Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
查看>>
【Android视图效果】分组列表实现吸顶效果
查看>>
title: postGreSQL 插件 timescaleDB 安装使用 date: 2019-02-14 18:02:23
查看>>
并发容器与框架——并发容器(一)
查看>>
网络编程socket
查看>>
学界 | 伯克利最新研究:用算法解决算法偏差?公平机器学习的延迟影响
查看>>
多文件上传示例源码(默认支持各种类型,包括图片)
查看>>
JS 中如何判断 undefined 和 null
查看>>
9.2. CentOS 区域设置
查看>>
命令行基本操作学习笔记(一)
查看>>
「试着读读 Vue 源代码」工程目录及本地运行(断点调试)
查看>>
Oracle——16用户、角色和权限
查看>>
获得系统属性
查看>>
从0实现NavigationController
查看>>
A Visual Git Reference
查看>>
Tomcat 关于表单提交数据量过大导致数据丢失的问题
查看>>
gitlab hook declined错误
查看>>
金融数据库
查看>>
翻了100个程序员的朋友圈, 发现个个都是套路王
查看>>