天天看点

重构版机房收费系统之分层、接口、数据库连接、反射+工厂(vb.net) 分层

        分层是为了减少层与层之间的依赖,增加程序的可读性,让整个系统结构清晰明确,还可大大降低维护成本,但是分层也有一定的缺点,有些可以直接访问数据库的层,却要通过负责访问数据库的层进行访问,这样,在访问数据库过程中就多出一个环节,增加了系统的开销,有时候要在表示层增加某个功能,为了降低耦合,就不得不自上而下,在每一层里面增加这个功能所需的服务类,这样就增加了开发成本

        分层越多越好吗?答案是否定的,引用一句话“我们也要     时刻谨记:不能盲目分层,不应分层而分层不应模式而模式。这是很重要的。不然只能增加开发的负担(在今后的实践中更好的体会)。”应该是说要根据实际的情况进行分层,毕竟不是绝对的,因为有些系统不分层比分层有点更多一些。

基本的分层主要用的是三层架构:

       表示层(UI)

       主要用于与用户的交互,负责传达用户的指令以及数据给BLL层,并把用户需要的数据显示出来,通俗的讲就是用户能见到的界面,如窗体程序。

       业务逻辑层(BLL)

       对数据的逻辑处理,比如把访问数据库得到的数据,转换成用户向看到的数据,并提交给表示层进行显示。

       数据访问层(DAL)

       对数据库进行访问,提供增删改查等操作。

下面是我的包图,每个包就是一个层,其中增加了实体层(Model)、接口层(IDAL)和工厂层(Factory)

重构版机房收费系统之分层、接口、数据库连接、反射+工厂(vb.net) 分层

实体层(Model)

实际上就是对应的数据库里面的每一张表,一个表就建一个类,一个类里面的属性则是对应表里面的字段,比如表BaseData_Info

重构版机房收费系统之分层、接口、数据库连接、反射+工厂(vb.net) 分层

在实体层中,就可以这样建立一个类:

         有什么用呢?当你需要注册一个用户时候,你得从表示层(UI)把数据传递给用于访问数据库的数据访问层(DAL),但是,你不可能把用户注册的信息:学号,姓名,卡号,注册日期,注册时间,班级。。。。。。等等把参数传递给函数,进行增加行操作吧?

对于数据库的访问,基本上什么语言都离不开这么几步:

1.      连接数据库

2.      执行sql语句

3.      返回sql语句的执行结构

       而连接数据库的字符串,大家可以参考

       执行sql语句可以参考

       下面是一个简单的数据库访问例子:

        其中连接数据库要用到的对象是SqlConnection,执行查询语句以及返回结果用的是SqlDataAdapter对象。

       数据库的连接有很多种方式,如本地、远程等。只要参考参考数据库连接字符串,依据自身情况进行选择使用就可以达到目的。

          对于反射,一开始我非常的茫然,在设计模式里面敲了例子之后,查了很多资料,也不知道怎么应用到收费系统中,确实笨到家了。不过,后来看到了高人的博客,才会了。看下图:

重构版机房收费系统之分层、接口、数据库连接、反射+工厂(vb.net) 分层

          假如说你有BLL和DAL2个层,你希望在BLL里面的一个类A使用DAL里面的BalanceDAL类,你可以通过引用DAL从而达到目的,但是,据说为了减少BLL与DAL的耦合性,所以在BLL和DAL之间加了个接口层叫IDAL。如下图

重构版机房收费系统之分层、接口、数据库连接、反射+工厂(vb.net) 分层

          可以看到框中的是上面DAL里面BalanceDAL的接口,这个接口里面包含了具体类(BalanceDAL)的所有方法,所以我们只要调用接口,就相当于调用了具体类(BalanceDAL),但是,前提是你必须把接口和具体类接通,就好比电视机和遥控器,遥控器是电视机接口,要想遥控器能控制接口,电视机里面应该要有一个能够接收并处理红外线新号的装置,当你使用遥控器的时候,遥控器跟电视机是联通的,他们之间通过了红外线联通。事实上,接口与具体类之间的关系,只是两者之间创建了一条管道,接口中没有具体的功能,但却有那个具体类使用的一个方法(就像遥控器上的按键),如果遥控器跟电视机之间没有联通,那么你按一下遥控器,是不会实现开机或者调频等功能的,所以,要使用接口,必须让接口与具体实现的类进行联通,这里有两步走,第一步是引用,第二步是创建实例。看下图:

重构版机房收费系统之分层、接口、数据库连接、反射+工厂(vb.net) 分层
重构版机房收费系统之分层、接口、数据库连接、反射+工厂(vb.net) 分层

        在DAL的引用里把IDAL打上勾就行了也就相当于在这两个层之间架起了桥梁,接下来,我们让DAL来实现这个接口,也就是在DAL里面创建具体类之后,写上关键字+你要实现的接口,然后回车,它就会自动列出你在接口里写的方法,然后再方法里,你去具体的实现吧。

重构版机房收费系统之分层、接口、数据库连接、反射+工厂(vb.net) 分层

        然后,我们需要在桥梁上面加管道,加了管道,就是把接口的方法和具体类的方法连接起来,使得我在BLL层里面调用接口的方法,就相当于调用了具体类的方法,但是我BLL并不知道具体类到底是怎么实现的,据说,这就是降低了BLL层与DAL层之间的耦合,因为我只关心接口IDAL就行了。如下代码,看BLL里是如何使用接口

        这里,我们首先引用了反射,然后创建接口(IBalance),再然后就是通过反射,把DAL层里的BalanceDAL具体类的实例反射过来给接口,这样,我们就相当于在接口和具体类之间连接了管道,然后我们就可以使用具体类的方法了:IBalance.SelectBalanceInfo(CardID)‘查询并返回数据集结果

        后来发现,把DAL层里面的类反射到BLL层里面,也就相当于在BLL层里面生产了DAL层的类,然后反射得到具体类的那些代码,我便抽象出了一个层,名曰Factory层,只要BLL引用工厂,便可以通过工厂返回具体类了。这也就是反射+工厂的应用吧。

        好像写的有点长,本来还有重载、配置文件、异常处理、存储过程等比较实用点的技术要写的,算了,放到下一篇吧。希望对大家有帮助。

        虽说面向对象比较复杂,但是总体的感觉,它就是把很多复杂的东西分类、分块、分层、分......然后用线把他们窜起来,你不必完全的记住所有的分块,但你可以顺着那些图纸毫不保留的了解到细节,只要去习惯这样的思维方式,相信也不太难的。

继续阅读