不该活着的SqlHelper和DBHelper

2023-11-06 20:08

本文主要是介绍不该活着的SqlHelper和DBHelper,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

还记得刚学ADO.NET的情景么?

还记得当年是怎么从ADO.NET被忽悠到用SqlHelper的么?

话说从入门到走上工作岗位那些年,我们就一直被纯纯地教导或引导,ADO.NET太原始,得封装成SqlHelper或DBHelper......

后来,这种思维一直深深就存在脑海里,并不知不觉中进入了潜意识,形成一种习惯。

在写框架的前几年,我也一直延续着这种思维,早期CYQ.Data的源码里,也有Sqlhelper,我也分享过Sqlhelper类的源码......

后来框架写久了,开始对框架的命名有讲究了,就默默低调的把Sqlhelper给改名了...

上个月的某一天,我给以前的同事传授知识时,不自觉的提到这个Helper悖论问题。

今天,无意中看到了这样的一篇文章,于是觉得可以分享一下自己的观点了:

文章里只有一个帮助类的代码,这里只截一小段:

 

这些年框架写多了,对面向对象相关的很多定义和使用,在潜意识里已经自有一套模式,以下分享两个小点:

1:定义Static变量需要考量的两个因素:内存和并发:

1:定义static变量:意味着该对象从始致终,都存在内存中,因此,你需要思考对象可预计或不可预计的大小,是否全局,若否,需要在何处需要将对象置Null?以便垃圾回收!

2:定义static变量:意思着在(Web)多线程环境下必然需要思考:是否有线程访问冲突?问题需要解决?需要Lock吗?需要双重判断?

若写代码时没有这两种考量,容易导致static乱用问题。

因此,上面的代码对Connection对象定义为static,明显错误有二:

1:资源只能用一个。

2:多线程下挂掉或抛异常是必然的,因为共用一个对象(场景如:A操作完Close,B操作到一半发现被Close了,好囧......)。

2:数据库操作类不应该为设计为static:

在现实的项目中,数据库的并发和事务是一件很自然就存在的事情。

因此:

1:并发的存在:意味着数据库操作类(ADO.NET)对象不能设置为static。

2:事务的存在:意味着数据库操作类不能将方法定义为static。

因此,数据库操作类合适的方式,应该设计成实例方式。

这里再补充一下,为什么不应该设计为static:

1:通过在static里方法产生实例,可以避免线程问题,但对象不能复用,事务没法用。

2:把对象提升为参数,外部实例后传入:能复用对事和事务,但根据业务场景需要不断增加重载方法,修改方法以适用,所以这种设计也不合理。

比如你需要增加参数来达到复用:执行的时候是否关闭链接、事务是否提交、参数是否清除、DataReader返回的参数重载等N种场景。

如果你说:你的业务场景就是不需要事务,场景相当简单,那我想,也不存在设计的问题了,爱咋咋的了......

3:关于XXXHepler或XXXUtility的思维定义:

我们可以用Reflector在微软的内库里搜Helper或Utitliy结尾定义的类,可以随便挑着看:

结论都一个样:

1:这个类应该是个帮助类或定义为static类。

2:内部应该(或大部分)是静态方法。

悖论出来了:

我在园子里扫了一下,发现大部分的SqlHelper类或DbHelper在经过项目的实战后,都知道该转成实例方式提供。

可是,既然都转成了实例,为啥还叫SqlHelper或DbHelper???

为啥?为啥?为啥?独独就对SqlHelper这个特殊呢?(那是我们从小就被教坏了。。。) 

总结:因果论:

因为:数据库操作设计不应该为Static,同时Helper后缀的不该设计为实例类。

所以:在数据库操作类设计里,SqlHelper和DBHelper不该存活。 

于是:如果你有幸运看到这篇文章,在教导新人的时候......切记,切记!记得把他教坏,哈!!!

原文地址:http://www.cnblogs.com/cyq1162/p/5745325.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

这篇关于不该活着的SqlHelper和DBHelper的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/358789

相关文章

杭州小伙逆行-没有生活,只有活着

前几天,杭州一小伙骑单车逆行刷爆网络。在路口被交警拦下后,小伙子接了一个电话。谁知打完电话后,小伙子摔了手机,崩溃爆发了… height="450" width="600" src="https://ugcws.video.gtimg.com/uwMROfz0r5zCYaQXGdGnC2dfDmYp-X0PaD-pLg4shqEe_wmq/y0856fjfyyz.mp4?sdtfrom=v1010

SqlHelper类实现增删改查的封装

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Configuration;using System.Data;using System.Data.SqlClient;namespac

《活着》读后感

《活着》读后感 这一次我读《活着》是极其的开心,开心有三:  一、内心相当的愉快和幸福  二、阅读速度大大提升。自己和自己比,进步很大,之前阅读差不多同样后的书《钢

机房收费系统——SqlHelper

前面自己将了一大堆ADO.NET的基础知识,现在该认真的实践一下了,下面我介绍一下vb.net版机房收费系统中,SqlHelper的使用,在机房收费中,SqlHelper是自己编写的一个类,里面用到的前面讲的几个对象的简单实例。     SqlHelper简介:SqlHelper是一个基于·NETFramework的数据库操作组件。组件中包含数据库操作方法。SqlHelper用于简化你重

SqlHelper 使用EF-Core框架 连接池处理并发

定义数据库 数据库名称:T_dicomPatientMsg 注意5大约束条件: 1.主键约束:primary key  IDKEY设置为主键,主键设置自增长 2.唯一性约束:unique 3.默认约束:default    所有值都要设置默认值,除了主键 4.检查约束:check 5.外键约束:foreign key 定义实体 public class DicomPatient

牛腩新闻发布系统(B/S)中的SQLHelper

1.关于SQLHelper的基础知识的说明,简单介绍一下: SqlHelper是一个基于.NET Framework的数据库操作组件。组件中包含数据库操作方法,SqlHelper有很多版本,主要以微软一开始发布的SqlHelper类,后面包含进了Enterprise Library开源包中了。还有一个主要版本是dbhelper.org开源的sqlhelper组件,优点是简洁,高性能,不仅仅支持s

机房重构之SqlHelper应用

由于机房重构过程中每个功能的实现都会涉及到数据库的链接访问,代码重复率非常高,耗时耗力,还会使系统出现代码冗余,是一件非常讨人厌的工作。进而把这些重复的代码抽象成一个类,以直接调用的方式来满足需求。 SqlHelper是一个基于·NET Framework的数据库操作组件,组件中包含数据库操作方法。SqlHelper用于简化重复的去写那些数据库连接(SqlConnection),SqlComma

sqlhelper封装

说明:         语言类型:C#              代码功能:对SQL增、删、改语句的封装                  实现:运用了配置文件 引用名称空间: using System.Data.SqlClient;using System.Configuration; sqlhelper代码: public class SQLhelper{priva

【机房重构】SQLHelper

一个系统中经常用到的一系列代码可以进行封装,以减少代码的编写量,并且可以增加系统的安全性。百度百科如是说: 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。          在重构的过程中,刚开始用到最多的就是数据库连接,对数据库数据的各种操作。为了简单方便便封装成

SqlHelper类的使用

机房重构进行了一小阶段,刚开始敲代码的时候,实现每一个功能都要在D层类中写一次数据据库连接SqlConnection,SqlCommand,SqlDataReader语句,感到相当地麻烦。遇到这个问题后,就想到了面向对象的封装性,把D层中重复的SQL语句封装起来,以提高代码的复用性。通过上网查资料,知道了SqlHelper类和其使用方法。     SqlHelper类将数据库连接(Sql