1. 中间层模式:
a) 所谓中间层类别(Category)的模式,就是指不必拘泥于物理上从客户端分离出来的服务器端.中间层意味着模式,结构或者逻辑的组合.
b) 主要模式如下:
i. 链式服务工厂-----------------为web服务创建单一的入口点
ii. 非链式服务工厂-------------web服务迟绑定单一入口点
iii. 产品管理器------------------以托管方式出来非托管代码
iv. 服务外观---------------------从web服务中委托复杂逻辑
v. 抽象包------------------------从复杂参数集合传递给web服务
vi. 包翻译器---------------------翻译那些复杂的参数集合
c) 理解链式服务工厂
i. 单一的服务入口
ii. 充分的利用DataSet这样通用数据类型
iii. 工厂模式
通过服务工厂提供不同服务,但是这个工厂对不同的服务提供一个单一的入口,比如Execute.这样客户端编程将变的简单.
我们如何得到我要的服务?通过DataSet这样一个通用的数据类型,把元数据都捆绑进去,在服务端,经过解包操作,将其抽取出来,并以此,按一定的规则初始化服务内容.
什么是”链式”? 以switch/case组织,实例化对象将被早绑定到服务中.我们要添加新的服务的时候,必须添加新的switch/case语句.
d) 理解非链式服务工厂
i. 它和链式服务工厂的意图是一样的,通过单一的入口提供服务,从而降低客户端编程的复杂性,使系统可扩展性增强.但是它又和链式的有区别.一个字”非”;
我们知道,链式服务工厂的实现是通过switch/case这样的将服务对象早绑定实现的,如果当我们要添加一个新的服务的时候,会显的很难看,因为我们必须从新编写我们的switch/case,这往往不是那么的优雅,同时也是bug滋生的地方.所以如果能够动态的,根据客户的需求活得服务该是多好啊,同时程序员也会说,如果能在对客户端透明的情况下增加服务是多么美好啊!这时,我们想到了晚绑定.
我们依旧从客户端活得一定的参数(DataSet),提出取业务对象构造的数据,再实例化服务对象,当然这次不是通过switch/case实现的,我们通过反射,动态的加载所需的程序集,从而业务对象的晚绑定.调用服务方法,活得服务(建议统一命名,如Execute).
看看它的实现:
[WebMethod]
public DataSet ExecuteLateBound(DataSet dsPacket)
{
DataSet ds = new DataSet();
Assembly oPMAssembly = null;
Type oFacadeType = null;
object oFacade = null;
MethodInfo oFactoryMethod = null;
object[] oaParams = null;
sService = PacketTranslator.GetService(dsPacket);
//load Assembly
oPMAssembly = Assembly.GetExecutingAssembly();
//基于传递的服务名字,返回类型和实例化外观类
oFacadeType = oPMAssembly.GetType("CompanyA.server" + "." + sService + "Facade");
oServiceFacade = Activator.CreateComInstanceFrom(oFacadeType);
//返回用于被选外观的工厂方法
//类/类型
oFactoryMethod = oFacadeType.GetMethod("Execute");
//绑定用于工厂方法的参数
oaParams = new object[1];
oaParams[0] = dsPacket;
//调用被选外观的Execute工厂方法
ds = (DataSet)oFactoryMethod.Invoke(oFacade, oaParams);
return ds;
}