[英]How to cast Azure DocumentDB Document class to my POCO class?
有沒有辦法將Microsoft.Azure.Documents.Document
對象轉換為我的類類型?
我用CosmosDBTrigger
編寫了一個 Azure Function 類。 觸發器接收Microsoft.Azure.Documents.Document
數組。 我喜歡有那個Document
類,這樣我就可以訪問關於記錄本身的元數據,但我也想以靜態方式與我的類類型中的數據交互。
當我調用ToString
時,我會看到我的數據的 JSON 表示。 我應該使用 Newtonsoft 將該 JSON 手動轉換為我的類類型嗎?
如果您需要在函數中將您的Document
映射到您的 POCO,那么最簡單的方法就是您所建議的。
調用document.Resource.ToString()
方法並使用來自 JSON.NET 或您喜歡的 json 庫的DeserializeObject
。 建議使用 JSON.NET,因為 Microsoft 的 CosmosDB 庫也使用它。
您的映射調用將如下所示:
var yourPoco = JsonConvert.DeserializeObject<YourPocoType>(document.Resource.ToString())
雖然 Nick Chapsas 提供的解決方案有效,但我想提供一些更好的選擇。
首先,如果您對額外的元字段感興趣,那么您始終可以將所選屬性包含到您的數據訪問模型中,並且它們將被填充。例如:
public class Model
{
public String id { get; set; }
public String _etag { get; set; }
//etc.
}
然后,您可以使用現有的 API 進行反序列化,這對所有人來說都是明確且熟悉的。 例如:
var explicitResult = await client.ReadDocumentAsync<Model>(documentUri);
Model explicitModel = explicitResult.Document;
如果您希望下一層模型(例如:域模型)沒有那些特定於存儲的元字段,那么您需要轉換為另一個模型,但這不再是 cosmosDB 級別的問題,並且有很多通用映射器可以轉換POCO 之間。
如果您使用強類型文檔模型,這是在 cosmosDB 中處理數據訪問的最簡潔且推薦的方法。
另一個技巧是使用動態作為中間轉換步驟。 這在某種程度上是簡短而優雅的,但個人使用 dynamic 總是感覺有點臟:
var documentResult = await client.ReadDocumentAsync(documentUri);
Model dynamicModel = (dynamic)documentResult.Resource;
JObject
另一種選擇是將文檔作為 NewtonSoft 的JObject
。 這也將包括所有元字段,您可以自己進一步投射它,而無需在字符串表示之間進行所有額外的跳躍。 例子:
var jObjectResult = await client.ReadDocumentAsync<JObject>(documentUri);
Model JObjectResult = jObjectResult.Document.ToObject<Model>();
Document
+ JObject
如果您真的想要避免模型中的文檔級元字段並仍然訪問它們,那么您可以使用一個小反射技巧從Document
實例中獲取JObject
:
var documentResult = await client.ReadDocumentAsync(documentUri);
Document documentModel = documentResult.Resource;
var propertyBagMember = documentResult.Resource.GetType()
.GetField("propertyBag", BindingFlags.NonPublic| BindingFlags.Instance);
Model reflectionModel = ((JObject)propertyBagMember.GetValue(documentResult.Resource))
.ToObject<Model>();
請注意,反射技巧依賴於內部實現細節,並且不受庫作者向后兼容性保證的約束。
您可以簡單地在Microsoft.Azure.Documents.Document
類中執行.ToString()
。
此類繼承自重寫.ToString()
方法的Microsoft.Azure.Documents.JsonSerializable
類。
下面是使用新的高性能System.Text.Json
命名空間將Document
類反序列化為我的Car.cs
POCO 的System.Text.Json
:
Car car = JsonSerializer.Deserialize<Car>(document.ToString());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.