我们设计的分层架构,层与层之间应该是松散耦合的。因为是单向单一调用,所以,这里的“松散耦合”实际是指上层类不能具体依赖于下层类,而应该依赖于下层提供的一个接口。这样,上层类不能直接实例化下层中的类,而只持有接口,至于接口所指变量最终究竟是哪一个类,则由依赖注入机制决定。
之所以这样做,是为了实现层与层之间的“可替换”式设计,例如,现在需要换一种方式实现数据访问层,只要这个实现遵循了前面定义的数据访问层接口,业务逻辑层和表示层不需要做任何改动,只需要改一下配置文件系统即可正常运行。另外,基于这种结构的系统,还可以实现并行开发。即不同开发人员可以专注于自己的层次,只有接口被定义好了,开发出来的东西就可以无缝连接。
在J2EE平台上,主要使用Spring框架实现依赖注入。这里,我们将自己做一个依赖注入容器。
依赖注入的理论基础是Abstract Factory设计模式,这里结合具体实例简单介绍一下。

上图以数据访问层为例,展示了Abstract Factory模式的应用。如图,现假设有针对Access和SQLServer两种数据库的数据访问层,它们都实现了数据访问层接口。每个数据访问层有自己的工厂,所有工厂都实现自IDALFactory接口。而客户类(这里就是业务逻辑层类)仅与工厂接口、数据访问层接口耦合,而与具体类无关,这样,只要通过配置文件确定实例化哪个工厂,就可以得到不同的数据访问层。
然而,这种设计虽然可行,但是代码比较冗余,因为这样需要为数据访问层的每一个实现编写一个工厂,业务逻辑层也一样。在以前,我们毫无办法,但是,.NET平台引入的反射机制,给我们提供了一种解决方案。使用反射,每个层只需要一个工厂,然后通过从配置文件中读出程序集的名称,动态加载相应类。另外,为了提高依赖注入机制的效率,这里引入缓存机制。下面来看具体实现。
配置
首先,需要在Web工程的Web.config文件的<appSettings>节点下添加如下两个项:
<add key="DAL" value=""/>
<add key="BLL" value=""/>
这两个配置选项分别存储要应用的数据访问和也业务逻辑层的程序集名称。value目前是空,是因为目前还没有各个层次的具体实现。
实现缓存操作辅助类
为实现缓存操作,我们将缓存操作封装成一个辅助类,放在Utility工程下,具体代码如下:
using System; namespace NGuestBook.Utility /**//// <summary> return cache[cacheKey]; |
封装依赖注入代码
因为很多依赖注入代码非常相似,为了减少重复性代码,我们将可复用的代码先封装在一个类中。具体代码如下(这个类放在Factory工程下):
using System; /**//// <summary> return dalObject; /**//// <summary> /**//// <summary> return bllObject; |
实现工厂
下面使用两个辅助类,实现数据访问层工厂和业务逻辑层工厂。
using System; namespace NGuestBook.Factory /**//// <summary> /**//// <summary> |
using System; namespace NGuestBook.Factory /**//// <summary> /**//// <summary> |
| · 网络函数库 | |
| · SQL Server不存在或访问被拒绝 Window | |
| · ASP.NET中动态控制RDLC报表 | |
| · 用PHP发送MIME邮件(五) | |
| · 在asp.net中为Web用户控件添加属性和事 | |
| · ASP检索网站指定目录文件的算法与应用 | |
| · 用PHP发送MIME邮件(四) | |
| · FrontPage服务器扩展 | |
| · 用ASP建立站内搜索 | |
| · 数据仓库解决方案指南 |
| · ASP动态网页编程的19个基本技巧 | |
| · 其它的ASP常用组件 | |
| · 抓取和分析 | |
| · ADO 存取数据库时如何分页显示 | |
| · 关于使用文本域(TextArea)的一个问题 | |
| · 堵住ASP漏洞 | |
| · PHP的面向对象编程:开发大型PHP项目 | |
| · 最新的ASP、IIS安全漏洞 | |
| · PHP的面向对象编程:开发大型PHP项目 | |
| · IIS 的 概 念 |