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对象。
如果你的逻辑更复杂,我认为这取决于你的情况。 让我用几句话来形容:
-
如果您无法更改类的来源并且想要调用公共方法,则最好使用reflection。 因此,您从WCF接收一个对象,使用返回的值设置
Person
对象的属性,然后调用该方法。 -
如果可以更改类的源,则可以创建基本接口
IPerson
,使用类中Person对象的属性实现此接口并返回IPerson
对象。 在这种情况下,您将能够执行演员表。
更多细节:好的,我来提供更多详细信息:
-
作为最佳实践,我建议使用接口创建单独的类。 这应该是一个描述您的对象的数据协定界面。 像这样的东西:
[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(); }
-
您正在实现的WCF方法应该返回IPerson类型。
- 在共享类中,请为您的
Person
对象实现接口IPerson
。 - 在Service和Client项目中引用此程序集。
- 在客户端项目中向WCF服务添加Web引用。
- 您的方法将返回
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; } }