Net Remoting基础篇4

时间:2010-02-04 13:03:37  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:etPersonInfo(string name,string sex,int age);    }      public class ServerObject:MarshalByRefObject,IServerObject   { ......}   注意:两边生成该对象程序集的名字必须相同,严格地说,是命名空间的名字必须相同。      (2) 客户端激活模式:  &n...
  正文: (1) WellKnown激活模式:
  
  通过接口来实现。在服务器端,提供接口和具体类的实现,而在客户端仅提供接口:
   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()方法来获得。而这个方法正是在客户端调用的。因此它的实现方式就等同于客户端激活模式。

Net Remoting基础篇4》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Programming/aspnet/12768.html


关键字:

关于《Net Remoting基础篇4》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td