中间层模式

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;           

 

} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值