簡體   English   中英

基於model屬性的序列化

[英]Serialization based on model attributes

我正在制作一個 .NET 6 項目,我需要針對外部 API 完成一項任務。

讓我們定義一個 model 來設置上下文。

class MyModel
{
    public bool field1;
    public string field2;
}

因此,model 將用於兩個動作。 首先,一個 GET 請求,它不能包含上面的一些字段,一個 POST 請求,它也不能包含上面的一些字段。

例如:

// GET
{
    MyModel: {
        field1: true
    }
}

// POST
{
    MyModel: {
        field1: false,
        field2: "some value"
    }
}

因此,當我執行 GET 操作時,我想包含一些特定的字段。 並發送兩個另外的外部 API,所以我從 API1 讀取,並將其發送到 API2。

當我執行 POST 操作時,我從 API2 讀取數據,並將數據插入 API1,但我只想包含一些預定義的字段。

我希望創建一個自定義屬性來反映該行為:

class MyModel
{
    [Read, Write]
    public bool field1;
    [Write]
    public string field2;
}

另請注意,字段也可用於 GET 操作,盡管用於 POST 操作。

我迷失了如何實現Newtonsoft.Json package 的行為,以使其了解如何根據輸入操作反序列化和序列化這些特定字段。

我的第一種方法是定義一個ReadWrite接口,當外部服務發出寫入請求時,它將序列化具有Read注釋的字段以發送數據,並且當發出讀取請求時, model 將知道如何將內容反序列化為具有Write的屬性。

您可能會注意到,概念是顛倒的。 Read表示將數據發送到外部 API (因為它將從另一個但內部 API 讀取), Write表示從外部 API 讀取數據(因為將插入我們的內部 API)

謝謝。

我建議對兩種型號簡單地使用 go。

A Read Model

class MyReadModel
{
    public bool field1;
}

和一個Write Model

class MyWriteModel
{
    public bool field1;
    public string field2;
}

這說明得很清楚。

考慮其他情況:例如,您想使用 Swagger 生成 API 文檔。 您還必須處理您的自定義屬性。

在你 controller 你將不得不方法:

[YourAllowAttribute]
[HttpGet]
public async Task<ActionResult<MyReadModel>> Get()
{
    // stuff
}

[YourPostAttribute]
[HttpPost]
public async Task<ActionResult<MyReadModel>> Write()
{
    // stuff
}

安全修整可以通過實現兩個屬性或策略來實現,例如[YourAllowAttribute][YourPostAttribute]

使用這種方法,您不會在 model 中混入關注點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM