我想在WCF中使用繼承的類型,但我不想在基類中添加所有類型的KnownType屬性,因爲基類位於另一個程序集中,還要避免依賴關係。 那麼,有什麼其他的方式來實現呢?什麼是在WCF中序列化繼承類型的另一種方法
回答
我認爲至少有兩種方法可以做到這一點。
您可以創建自己的類(DTO)並將數據從其他程序集映射到類中。對於映射,您可以使用AutoMapper。它具有以下優點:
- 你的通信層是從你的邏輯separeted(我假設這其它組件包括邏輯)
- 你將決定你的API的樣子和你的協議不會改變沒有你知識(我在這裏假設這個其他程序集是一個庫或其他人負責它)。
您可以添加
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.
指定已知類型的方法有更多。其中之一是將它們放入配置文件中。這樣你的服務在編譯時就不知道它們了。但爲了序列化它們,它必須在運行時瞭解它們。
這聽起來很合理,但如何做到這一點,你可以給我一個教程或一些參考。 –
不,不是,我不得不穀歌它,但你可以自己做。 –
到現在爲止我沒有想到,但另一種選擇是使用你的DI容器,如果你有。您將註冊基類的所有派生類型,然後請求所有這些類型。然後,您可以通過編程方式告訴WCF哪些已知類型。同樣,我不知道API,但這是添加我知道的已知類型的第三種方法。 –
- 1. WCF - probem與序列化繼承類型
- 2. 繼承類的另一種類型的
- 3. 匿名類型是否可以繼承另一種類型?
- 4. 在類中繼承多種方法
- 5. xml序列化和繼承類型
- 6. 爲什麼有兩種相同類型的xmls,一種不是反序列化,另一種是?
- 7. 反序列化繼承類
- 8. JavaScript繼承。從另一個類繼承的對象和方法
- 9. 在C++中計算double類型變量的另一種方法是什麼?
- 10. 多種類型的繼承
- 11. WCF繼承/多態性和序列化
- 12. 將繼承類型的DataContract序列化爲基類型
- 13. 這是什麼類型的序列化?
- 14. 從Canvas類繼承的序列化類
- 15. 這是一種簡化我的繼承類的有效方法嗎?
- 16. 什麼是一種「類型」?
- 17. 這種繼承類調用(虛函數)的方法是什麼? C++
- 18. 爲什麼這種繼承失敗(父類的方法是使用)C++
- 19. 什麼是使一個類不可序列化的好方法?
- 20. 繼承類一種形式到另一種形式類
- 21. 什麼類型的序列化在幕後使用Wcf?
- 22. DatacontractSerializer不會將基類型序列化爲繼承類型
- 23. JSON序列化繼承的模型
- 24. 繼承模型的Django序列化
- 25. 什麼是在jquery中查找next()。next()的另一種方法
- 26. 初始化std :: array類的繼承成員var的最佳方法是什麼?
- 27. 什麼類型的繼承允許這
- 28. 使用繼承類型的列表序列化
- 29. 什麼是在繼承類中使用鎖的最佳做法
- 30. 不用lodash調用方法的另一種方法是什麼?
謝謝你的安撫者,但那意味着我不得不退休所有我的班級,數百人,重複和需要這麼多的工作。 Ans第二種方式,我的服務非常瞭解我的班級,這是強大的耦合,我不想這樣。我的服務必須只知道基類。 –
但是你的服務必須知道所有的類,例如在'BasicHttpBinding'的情況下生成WSDL。您不能將WCF與傳輸對象分開。你不應該想象WCF就像它是一個接口。 WCF允許你創建api /協議,並且必須定義好。我想說在這裏需要強大的耦合。 – Kedrzu
這是一個很好的觀點,但我的服務也從其他服務繼承,我不知道這是否會工作或給我其他問題。這將是我最後的解決方案,如果我沒有找到一個更好的。 –