当服务器端将远程对象注册到服务器端时,远程对象并没有实例化。当客户端获取远程对象时,远程对象仍然没有实例化。只有当客户端调用远程对象方法时,远程对象才会在服务器端生成实例化对象。
服务器端激活模式又分为Singleton和SingleCall两种模式:
ØSingleton
Singleton从字面上很容易获知,当选择Singleton模式时,在服务器端的远程对象将会有零或至多一个实例化对象。
服务器端注册远程对象的代码事例如下:
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Calculator),
"CalculatorService", WellKnownObjectMode.Singleton);
服务器端注册远程对象的配置文件事例如下:
<wellknown mode="Singleton" type="Inovout.Remoting.RemotingObject.Calculator,RemotingObjectClassLibrary"
objectUri="CalculatorService"/>
客户端获取远程对象的代码事例如下:
calculator = (Calculator)Activator.GetObject(
typeof(Calculator), "tcp://localhost:8891/CalculatorService");
客户端获取远程对象的配置事例如下:
<wellknown
type="Inovout.Remoting.RemotingObject.Calculator,RemotingObjectClassLibrary"
url="tcp://localhost:8891/CalculatorService" />
Calculator calculator = new Calculator();
客户端运行结果效果图
ØSingleCall
SingleCall与Singleton的不同在于,SingleCall可以在客户端调用远程对象方法时,为每个客户端生成远程对象实例对象。但是,当远程对象方法调用完成后,刚生成的远程对象实例化对象会立即销毁。当下次再次调用远程对象方法,会再次生成远程对象实例化对象。
服务器端注册远程对象的代码事例如下:
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Calculator),
"CalculatorService", WellKnownObjectMode. SingleCall);
服务器端注册远程对象的配置文件事例如下:
<wellknown mode="SingleCall" type="Inovout.Remoting.RemotingObject.Calculator,RemotingObjectClassLibrary"
objectUri="CalculatorService"/>
客户端获取远程对象的代码事例如下:
Calculator calculator = (Calculator)Activator.GetObject(
typeof(Calculator), "tcp://localhost:8891/CalculatorService");
客户端获取远程对象的配置事例如下:
<wellknown
type="Inovout.Remoting.RemotingObject.Calculator,RemotingObjectClassLibrary"
url="tcp://localhost:8891/CalculatorService" />
calculator = new Calculator();
客户端运行结果效果图
服务器激活模式对于客户端而言,所有代码完全相同,原因很容易解释。因为在这种激活模式下,是由服务器端来决定远程对象相关信息和状态。但是,由于.NET Remoting为开发人员做了非常好的封装,也使开发人员非常容易完成Singleton和SingleCall两种服务器激活模式的注册工作,而且两种模式的代码几乎完全一样。两种服务器激活模式具体不同点如下:
比例项目 | Singleton | SingleCall |
实例化对象个数 | 1 | 为每个客户端生成一个实例化对象 |
生存周期 | 由服务器端租约决定 | 调用完方法后立即销毁 |
状态 | 有 | 无 |