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

时间:2011-10-10 21:25:14

标签: c# wcf

这是一个技术问题的设计。我不确定我这样做是对的......

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

我想在客户端上调用Person的方法。我知道这些不能从API下游发送。但是,如果我引用WCF使用的相同.dll,我是否可以将API Person转换为.dll Person然后运行方法?

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

3 个答案:

答案 0 :(得分:2)

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

如果你的逻辑更复杂,我认为这取决于你的情况。让我用几句话来形容:

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

  2. 如果您可以更改类的源,则可以创建基接口IPerson,使用类中Person对象的属性实现此接口并返回IPerson对象。在这种情况下,您将能够执行演员表。

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

    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. 在共享课程中,请为IPerson对象实施界面Person
    4. 在您的服务和客户项目中引用此程序集。
    5. 在客户端项目中向WCF服务添加Web引用。
    6. 您的方法将返回类型为IPerson的对象,因此您可以使用共享库中的Person对象,并使用其所有方法。

答案 1 :(得分:1)

由于您引用了相同的dll,并且WCF可以是强类型的,因此您应该能够在不转换的情况下调用Person响应对象上的方法。确保在定义Person类时使用DataContract属性。

在下面的示例中,WCF将使用服务器端的三个数据成员序列化Person类。客户端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;
   }  
}

答案 2 :(得分:1)

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

然后,您可以将程序集添加到WCF服务和调用客户端项目,并指示WCF重新使用任何现有引用。这样,从服务中撤回的内容被反序列化为Person的本地副本,但不是作为代理生成的Person,您实际上获得了一个完整的实例,您可以在其上执行方法调用。

不要忘记,在这种情况下,你是按值进行编组。您对Person实例所做的任何更改都只是客户端的本地更改,您需要再次将其传回上游到WCF服务(通过序列化),以便服务识别任何更改并相应地执行操作。