.NET Remoting——practice & progress(3):Client Activated客户端激活

来源:互联网 发布:java constructor类型 编辑:程序博客网 时间:2024/06/06 05:56
 .NET Remoting除了提供了服务器端激活模式之外,还提供了客户端激活模式。服务器端激活模式有SingletonSingleCall两种方式。但是,这两种方式都有由非常明显的优缺点,Remote Object在服务器端不能同时满足既可以维护其状态(SingleCall模式,当远程对象方法被调用完成后,该远程对象会立即被服务器端消毁),可以为每个客户端生成一个远程对象,每个对象保持其相应的独立性(Singleton只能生成一个远程对象实例,所有客户端都共享同一个远程对象实例)。客户端激活模式就是解决这两个问题。

          当服务器端将远程对象注册到服务器端时,远程对象并没有实例化。当客户端获取远程对象时,远程对象被实例化,而且支持参数化的构造,这点与服务器端激活模式是显著的不同。而且,服务器端激活模式只支持默认构造函数。

          服务器端注册远程对象的代码事例如下:

          //服务器端激活模式只能提供默认构造器的远程对象实例。客户端激活模式支持带参构造,并且向服务器环境注册时,又必须是已实例化的对象。因此,没有URI也不能有URI,注册时,服务器端根本无法不知道客户端会选择哪种构造器实例化远程对象。

          RemotingConfiguration.ApplicationName = "CalculatorService";

          //因为注册时,并没有提供URI,所以需设置RemotingConfigurationApplicationName,以便让客户端找到该远程对象。

          RemotingConfiguration.RegisterActivatedServiceType(typeof(Calculator));

          服务器端注册远程对象的配置文件事例如下:

    <application name="CalculatorService">

      <service>

        <activated type="Inovout.Remoting.RemotingObject.Calculator,RemotingObjectClassLibrary"/>

      </service>

          客户端获取远程对象的代码事例如下:

          object[] activatorAttribute = {new UrlAttribute("tcp://localhost:8891/CalculatorService")};

                Calculator calculator = (Calculator)Activator.CreateInstance(

                             typeof(Calculator), null, activatorAttribute);

          客户端获取远程对象的配置事例如下:

      <client url="tcp://localhost:8891/CalculatorService">

        <activated type="Inovout.Remoting.RemotingObject.Calculator,RemotingObjectClassLibrary"/>

      </client>

          客户端运行结果效果图
客户端激活模式

 

          客户端激活模式相对于服务器端激活模式,具有非常灵活的特性,几乎与本地对象没有区别。但是这是以牺牲服务器端资源为代价的。服务器端模式无论是Singleton还是SingleCall都是远程对象方法被调用时才会被实例化,Singleton至多只会有一个实例,SingleCall干脆就不会存在。但是,选择客户端模式激活的远程对象是在new的时候就被创建实例化对象,而且会为每个客户端生成一个远程对象实例。

          服务器激活模式与客户端激活模式比较如下:

比较项目

服务器端激活

客户端激活

实例化对象时间

远程对象方法被调用

New的时候

实例化对象个数

Singleton至多有1/SingleCall多个

多个

构造函数

默认空构造函数

支持参数化构造

状态

Singleton有状态/SingleCall无状态

可以进行状态管理

占用服务器资源

不大

较大

          客户端激活模式支持参数化构造函数,这对于开发人员来说是非常重要的特性,非常有利于开发人员采用面向对象思想来设计和开发.NET Remoting(为达到维护远程对象完全可以通过相关方法来实现,但那些都不是面向对象思想的体现)。

 

?疑问:客户端激活模式的URLURI设置感觉不是很方便,特别别扭,不知道为什么.NET Remoting不能提供象服务器端激活模式那样的设置方式吗?