2017-08-03 29 views

回答

1

我認爲至少有兩種方法可以做到這一點。

  1. 您可以創建自己的類(DTO)並將數據從其他程序集映射到類中。對於映射,您可以使用AutoMapper。它具有以下優點:

    • 你的通信層是從你的邏輯separeted(我假設這其它組件包括邏輯)
    • 你將決定你的API的樣子和你的協議不會改變沒有你知識(我在這裏假設這個其他程序集是一個庫或其他人負責它)。
  2. 您可以添加ServiceKnownType到您的ServiceContract接口或多或少像下面(我沒有測試的代碼):

    [DataContract] 
    public class BaseClass {} 
    
    [DataContract] 
    public class DerivedClass : BaseClass {} 
    
    [ServiceKnownType(typeof(BaseClass))] 
    [ServiceKnownType(typeof(DerivedClass))] 
    [ServiceContract()] 
    public interface IYourContract 
    { 
        [OperationContract] 
        BaseClass[] GetClasses(); 
    } 
    

    欲瞭解更多信息,請查閱文檔here。有一個很好的例子。

哪個是beter?

這取決於你需要什麼。如果您正在開發原型,或者您需要快速做出選擇2.如果您需要更可靠的解決方案,那麼您可以隨時選擇更長的選項1.

+0

謝謝你的安撫者,但那意味着我不得不退休所有我的班級,數百人,重複和需要這麼多的工作。 Ans第二種方式,我的服務非常瞭解我的班級,這是強大的耦合,我不想這樣。我的服務必須只知道基類。 –

+0

但是你的服務必須知道所有的類,例如在'BasicHttpBinding'的情況下生成WSDL。您不能將WCF與傳輸對象分開。你不應該想象WCF就像它是一個接口。 WCF允許你創建api /協議,並且必須定義好。我想說在這裏需​​要強大的耦合。 – Kedrzu

+0

這是一個很好的觀點,但我的服務也從其他服務繼承,我不知道這是否會工作或給我其他問題。這將是我最後的解決方案,如果我沒有找到一個更好的。 –

1

指定已知類型的方法有更多。其中之一是將它們放入配置文件中。這樣你的服務在編譯時就不知道它們了。但爲了序列化它們,它必須在運行時瞭解它們。

+0

這聽起來很合理,但如何做到這一點,你可以給我一個教程或一些參考。 –

+0

不,不是,我不得不穀歌它,但你可以自己做。 –

+0

到現在爲止我沒有想到,但另一種選擇是使用你的DI容器,如果你有。您將註冊基類的所有派生類型,然後請求所有這些類型。然後,您可以通過編程方式告訴WCF哪些已知類型。同樣,我不知道API,但這是添加我知道的已知類型的第三種方法。 –

相關問題