Net Remoting基础篇4
点击次数:16 次 发布日期:2008-11-26 10:43:53 作者:源代码网
|
源代码网推荐 源代码网推荐 通过接口来实现。在服务器端,提供接口和具体类的实现,而在客户端仅提供接口: 源代码网推荐 public interface IServerObject 源代码网推荐 { 源代码网推荐 Person GetPersonInfo(string name,string sex,int age); 源代码网推荐 } 源代码网推荐 源代码网推荐 public class ServerObject:MarshalByRefObject,IServerObject 源代码网推荐 { ......} 源代码网推荐 注意:两边生成该对象程序集的名字必须相同,严格地说,是命名空间的名字必须相同。 源代码网推荐 源代码网推荐 (2) 客户端激活模式: 源代码网推荐 源代码网推荐 如前所述,对于客户端激活模式,不管是使用静态方法,还是使用CreateInstance()方法,都必须在客户端调用构造函数实例化对象。所以,在客户端我们提供的远程对象,就不能只提供接口,而没有类的实现。实际上,要做到与远程对象元数据的分离,可以由两种方法供选择: 源代码网推荐 源代码网推荐 a、利用WellKnown激活模式模拟客户端激活模式: 源代码网推荐 源代码网推荐 方法是利用设计模式中的“抽象工厂”,下面的类图表描述了总体解决方案: 源代码网推荐 源代码网推荐
源代码网推荐 我们在服务器端的远程对象中加上抽象工厂的接口和实现类: 源代码网推荐 public interface IServerObject 源代码网推荐 { 源代码网推荐 Person GetPersonInfo(string name,string sex,int age); 源代码网推荐 } 源代码网推荐 源代码网推荐 public interface IServerObjFactory 源代码网推荐 { 源代码网推荐 IServerObject CreateInstance(); 源代码网推荐 } 源代码网推荐 源代码网推荐 public class ServerObject:MarshalByRefObject,IServerObject 源代码网推荐 { 源代码网推荐 public Person GetPersonInfo(string name,string sex,int age) 源代码网推荐 { 源代码网推荐 Person person = new Person(); 源代码网推荐 person.Name = name; 源代码网推荐 person.Sex = sex; 源代码网推荐 person.Age = age; 源代码网推荐 return person; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 public class ServerObjFactory:MarshalByRefObject,IServerObjFactory 源代码网推荐 { 源代码网推荐 public IServerObject CreateInstance() 源代码网推荐 { 源代码网推荐 return new ServerObject(); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 然后再客户端的远程对象中只提供工厂接口和原来的对象接口: 源代码网推荐 public interface IServerObject 源代码网推荐 { 源代码网推荐 Person GetPersonInfo(string name,string sex,int age); 源代码网推荐 } 源代码网推荐 源代码网推荐 public interface IServerObjFactory 源代码网推荐 { 源代码网推荐 IServerObject CreateInstance(); 源代码网推荐 } 源代码网推荐 我们用WellKnown激活模式注册远程对象,在服务器端: 源代码网推荐 //传递对象; 源代码网推荐 RemotingConfiguration.RegisterWellKnownServiceType( 源代码网推荐 typeof(ServerRemoteObject.ServerObjFactory), 源代码网推荐 "ServiceMessage",WellKnownObjectMode.SingleCall); 源代码网推荐 源代码网推荐 注意这里注册的不是ServerObject类对象,而是ServerObjFactory类对象。 源代码网推荐 源代码网推荐 客户端: 源代码网推荐 ServerRemoteObject.IServerObjFactory serverFactory = 源代码网推荐 (ServerRemoteObject.IServerObjFactory) Activator.GetObject( 源代码网推荐 typeof(ServerRemoteObject.IServerObjFactory), 源代码网推荐 "tcp://localhost:8080/ServiceMessage"); 源代码网推荐 源代码网推荐 ServerRemoteObject.IServerObject serverObj = serverFactory.CreateInstance(); 源代码网推荐 源代码网推荐 为什么说这是一种客户端激活模式的模拟呢?从激活的方法来看,我们是使用了SingleCall模式来激活对象,但此时激活的并非我们要传递的远程对象,而是工厂对象。如果客户端要创建远程对象,还应该通过工厂对象的CreateInstance()方法来获得。而这个方法正是在客户端调用的。因此它的实现方式就等同于客户端激活模式。 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
