初到公司项目经理就给我一个
Demo
让我去看,而且告诉我公司基本的所有软件都是这样的架构,要我尽量看懂。下面就谈谈我看这个
Demo
的体会。
由于以前在学校做过一些小的软件,而且也是尽量采用
MVC
的架构,所以大概用了半天我就自认为看的差不多了,还做在那洋洋自得。不过也是刚进公司的一位仁兄问了我几个问题我才知道,其实我还有好多东西就知道一点皮毛。因此,我就静下心来重新开始看。
好了,说了一大堆废话,进入正题吧。
首先,用一个图说明整个软件大致的架构,然后再详细介绍我的体会。
View
|
Control
|
Model
|
Database
|
说明:这个图可能画的不太准确,请大家指教。
由于我一段时间刚做完我的毕业设计,我也把我做的软件的大致架构用图展示一下:
View
|
Control
|
Model
|
Database
|
IDAL
|
然后,我就对比公司的软件的架构和我的软件做详细的说明。从图上看我的好像多了一层,多的这一层主要是个接口层,要这一层干什么用呢?由于当初我学了一点设计模式(今天才知道自己当初根本就只知道一点皮毛),面向对象提倡三种编程方式:按接口编程,用组合代替继承,隐藏细节。所以我当初就想,做一个接口层,把所有的业务逻辑先放在这个接口层中,然后再用一个层去实现它,事实证明是有一点效果的,有点面向对象中要求的强内聚,松耦合的意思。
视图层
(View)
我做的时候把一些常用的以及复杂的控件都封装在了用户控件中,我查了一些资料,这样是有一点好处的,首先这样可以减少耦合度,而且可以隐藏自己写的代码,甚至有时为了提高效率可以做一下局部缓冲也方便一点。公司的好多仁兄也是这样做的,这一点我好像跟大伙一样的。然后由于我当初是用
VS2005.NET
开发的,听说
ObjectDataSource
是一个的控件,所以我基本上在
View
中用的是
ObjectDataSource
绑定的业务逻辑层的方法,一句代码都不用写,而且还很灵活。公司的这个架构听说是二零零二年就开始用了,所以没有采用
ObjectDataSource,
公司是对应每个表继承写一个类作为数据源,这些类都继承于
DataSet
类。
至于业务层,公司直接为每个表做了对应一个类去调用数据访问层的代码,这样做是有目的的,很好的体现了面向对象思想,减少了层与层之间的耦合度。其实,这一个层我也做了,只不过我可能叫它服务层
(
自己取的名字
)
吧!
然后再说数据访问层和实体层。数据访问层就是写好一些对数据库中的表进行增删改查的方法,给业务层
(
其实我认为这个叫业务层不太好,我认为还是叫服务层,因为我是这么认为的,如果一个软件有复杂的业务逻辑,就写到业务层中去,这个业务层实际上把一些数据处理之后,才给数据访问层处理的,或是数据访问层的数据给业务层处理之后,然后给服务层或直接给界面层的,但是我们做的一般的软件好像是没有什么要处理复杂的数据的,也就是对数据库中的表进行基本的操作,所以一般没有业务层。其实这也就是一个习惯的问题
)
去调用它们的。这个地方我和公司做的有点不一样,我是把对于所有数据库操作的
T-SQL
语句写成了存储过程,也同样是我查的一些资料,一个简单的
T-SQL
语句每次要执行五步,但是如何写成存储过程之后就第一次要五步,以后只要其中的两步就可以完成,可以大大的提高效率。公司的
Select
好像是拼接起来的,然后其他的就是通过加参数,我上次听微软的一个讲师说,这样不是太好的。实体类在上面已经说了,公司的是每个表对应一个类,而且这个类继承与
DataSet,
但是我做的时候用了泛型,返回了是一个
ArrayList
泛型类的结果集。
最后说说和数据库直接打交道的几个类吧。其实,访问数据库很好的采用的工厂设计模式,下面是公司的这几个类的类图:
Abstract class: Database
|
class:OdbcDatabase
|
class:oleDatabasee
|
class:oracleDatabase
|
class:SqlDatabase
|
public class DatabaseFactory
{
public DatabaseFactory();
public static string ConnectionString { get; set; }
public static DatabaseType DatabaseType { get; set; }
public static string DefaultConnectionString { get; set; }
public static Database Create();
public static Database Create(string strConnectionString);
}
我怎么也看不明白,这是个什么呢?这些方法怎么没实现,也不是抽象类,于是直接告诉我,这个东西可能加密了,但是我不知道怎么解。几天之后,我学那个
ASP.NET2.0
中的
membership
时,因为它是一个社区的人做的,所以有源代码下载,我把源代码一打开,傻了,结果也是像上面的代码,但是我接着那篇帖子向下看,有了!告诉我用
Reflector.exe
工具可以查看,我当时非常的高兴,终于可以看公司的这几个神秘的类了。
好了,上面分析了公司的软件的架构和我的软件的架构的异同,希望有不好的地方各位仁兄给予帮助和指导。