当服务器端将远程对象注册到服务器端时,远程对象并没有实例化。当客户端获取远程对象时,远程对象被实例化,而且支持参数化的构造,这点与服务器端激活模式是显著的不同。而且,服务器端激活模式只支持默认构造函数。
服务器端注册远程对象的代码事例如下:
//服务器端激活模式只能提供默认构造器的远程对象实例。客户端激活模式支持带参构造,并且向服务器环境注册时,又必须是已实例化的对象。因此,没有URI也不能有URI,注册时,服务器端根本无法不知道客户端会选择哪种构造器实例化远程对象。
RemotingConfiguration.ApplicationName = "CalculatorService";
//因为注册时,并没有提供URI,所以需设置RemotingConfiguration的ApplicationName,以便让客户端找到该远程对象。
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(为达到维护远程对象完全可以通过相关方法来实现,但那些都不是面向对象思想的体现)。
?疑问:客户端激活模式的URL和URI设置感觉不是很方便,特别别扭,不知道为什么.NET Remoting不能提供象服务器端激活模式那样的设置方式吗?