再说MVC

  
初到公司项目经理就给我一个 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
说明:由于我这没有画 UML 图的工具,所以只能画成这样了,也就是下面四个类都继承于上面那个类,然后做了一个工厂类 DatabaseFactory ,用来根据传入的一些参数生产相应的类。刚开始在公司的这个 DatabaseFactory 类好像加密了,代码如下:

    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 工具可以查看,我当时非常的高兴,终于可以看公司的这几个神秘的类了。
         好了,上面分析了公司的软件的架构和我的软件的架构的异同,希望有不好的地方各位仁兄给予帮助和指导。
 
 
 
 
 
 
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值