簡體   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