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

这既是设计又是技术问题。 我不确定我这样做是对的……

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

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

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

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

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

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

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

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

  1. 如果您无法更改类的来源并且想要调用公共方法,则最好使用reflection。 因此,您从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属性。

在下面的示例中,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; } }