繁体   English   中英

WCF将自定义对象传递给客户端并运行其方法

[英]WCF passing a custom object to client and running its methods

这既是设计,又是技术问题。 我不确定我做对了吗...

我有一个WCF API,它与数据库进行通信并传回一个Person对象(在一个单独的.dll中定义)。该对象同时具有方法和属性。 该对象正从WCF发送到调用客户端。

我想在客户端上调用Person的方法。 我了解这些无法从API下游发送。 但是,如果我引用WCF使用的同一.dll,是否应该能够将API Person转换为.dll Person,然后运行这些方法?

我希望很清楚我要实现的目标。

WCF通过数据合同进行工作。 这些是要返回的数据模型,例如具有其属性的Person对象。 在将对象从Service传输到Client时,不必担心方法的问题。 如果使用了数据协定,并且您将引用WCF,则代理类将生成一个Person对象。

如果您的逻辑比较复杂,我想这取决于您的情况。 让我用几句话来形容:

  1. 如果您无法更改类的源,并且想要调用公共方法,则最好使用反射。 因此,您从WCF接收到一个对象,使用返回的值设置Person对象的属性,然后调用该方法。

  2. 如果可以更改类的源,则可以创建基本接口IPerson ,使用类中Person对象的属性实现此接口,然后返回IPerson对象。 在这种情况下,您将可以执行投射。

更多详细信息:好的,让我为您提供更多详细信息:

  1. 作为最佳实践,我建议使用接口创建单独的类。 这应该是一个数据合约接口,它将描述您的对象。 像这样:

     [DataContract] public interface IPerson { [DataMember] public int Identifier { get; set; } [DataMember] public string First { get; set; } [DataMember] public string Last { get; set; } public string GetSomething(); } 
  2. 您正在实现的WCF上的方法应返回IPerson类型。

  3. 在共享类中,请为您的Person对象实现接口IPerson
  4. 在您的Service和Client项目中引用此程序集。
  5. 在您的客户端项目中为WCF服务添加Web参考。
  6. 您的方法将返回IPerson类型的对象,因此您可以使用共享库中的Person对象,并使用其所有方法。

由于您引用的是同一个dll,并且WCF可以是强类型的,因此您应该能够在Person响应对象上调用方法而无需进行强制转换。 确保在定义Person类时使用的是DataContract属性。

在下面的示例中,Person类将由WCF在服务器端使用三个数据成员进行序列化。 客户端WCF将反序列化响应...创建类Person。 因此,在客户端,您可以调用FullName(),它将在不强制转换的情况下运行。

 [DataContract]
 public class Person
{
   [DataMember]
   public int Identifier { get; set; }
   [DataMember]
   public string First { get; set; }
   [DataMember]
   public string Last { get; set; }
   public string FullName()
   {
      return First + " " + Last;
   }  
}

WCF支持重用项目中已经包含的引用的功能。 从这个意义上讲,您可以创建一个合同程序集(一个包含您的瘦域模型(例如Person等)的程序集,您可以在其中添加自己的逻辑。

然后,您可以将程序集添加到WCF服务和调用客户端项目中,并指示WCF重新使用任何现有引用。 这样一来,什么是您的服务拉回被deserialised成的本地副本Person ,但没有一个Person会为代理产生的,你实际上得到一个完整的情况下,可以在其上执行方法调用。

不要忘记,在这种情况下,您正在按价值进行编组。 您对Person实例所做的任何更改仅在客户端本地,您需要将其再次上游(通过序列化)传递回WCF服务,以便该服务识别任何更改并采取相应措施。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM