[英]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 的行為,以使其了解如何根據輸入操作反序列化和序列化這些特定字段。
我的第一種方法是定義一個Read
和Write
接口,當外部服務發出寫入請求時,它將序列化具有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.