我不清楚有關屬性和程式集依賴項的規則。
是否可以(并且不是一個糟糕的想法)使用 NuGet 包中的自定義屬性注釋程式集中的型別而不引入對該 NuGet 包的運行時依賴關系?客戶是否可以使用程式集中的型別而無需提供自定義包的程式集?
我問是因為我的 .NET 應用程式使用兩個包:
一個名為YamlDotNet的第三方 NuGet 包,用于將型別序列化為 YAML。它允許您使用類似于 Microsoft 的 XML 屬性的自定義屬性來控制 YAML 序列化(例如,它具有
YamlIgnoreAttribute類似于 MS'XmlIgnoreAttribute)我自己的包PackageA不依賴于 YamlDotNet。
我希望我的應用程式使用 YamlDotNet 從 PackageA 序列化我的型別。但除非我執行以下操作之一,否則它們將無法正確序列化:
- 使用 YamlDotNet 自定義屬性注釋 PackageA 中的型別
- 在應用程式中為 PackageA 型別創建帶注釋的包裝器,以便為我進行序列化。
我可以做#2,但做#1會更容易。但我不想為 PackageA 的所有客戶端引入對 YamlDotNet 的運行時依賴。 理想情況下,我希望任何使用 PackageA 的人也恰好使用 YamlDotNet 來免費獲得這些屬性,并且讓其他人看不到它們。
我想要的可能嗎?
uj5u.com熱心網友回復:
屬性是一個編譯時特性,你總是需要參考 YamlDotNet 才能使用它的一種型別作為編譯時型別元資料,除非你愿意做一些事情,比如在運行時生成模型類(這是相當可能比擁有一個額外的包參考更麻煩)。
這是一個普遍的問題,其中使用序列化程式的屬性驅動功能會污染目標程式集并將其與該序列化程式耦合。
有三種方法可以解決這個問題:
- 接受這個作為妥協
- 將 YamlDotNet 特定移動到單獨的程式集中
- 有單獨的序列化模型
第一點應該很清楚-這是您不想要的,也是您的第一個建議。
第二點可能是在單獨的程式集中創建特定于 YamlDotNet 的型別包裝器或型別轉換器(如果它支持這些東西),以便核心程式集保持清潔。這是您的第二個建議,只是帶有一些轉換器,這可能比從消費者的角度包裝所有內容更令人愉快。
第三點是關于在核心程式集中創建 DTO/有效負載,這樣您就不必使用任何特定于序列化程式的屬性,并且序列化可以開箱即用。如果您需要[YamlIgnore]屬性,用于序列化的模型可能還用于其他目的,因此這基本上只是關注點分離。如果您序列化您的應用程式模型,您可能會發現在不影響各個地方的業務邏輯的情況下提供向后兼容性是不可能的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/423445.html
標籤:
上一篇:將陣列傳遞給查詢字串
下一篇:增刪商品計算價格
