[英]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對象。
如果您的邏輯比較復雜,我想這取決於您的情況。 讓我用幾句話來形容:
如果您無法更改類的源,並且想要調用公共方法,則最好使用反射。 因此,您從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
。 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.