通过 id 实例化 dto 对象,其中对象作为有效负载 C#
Posted
技术标签:
【中文标题】通过 id 实例化 dto 对象,其中对象作为有效负载 C#【英文标题】:Instantiate dto object by id where object received as payload C# 【发布时间】:2019-11-16 14:49:57 【问题描述】:有一个任务控制器函数接收 DTO JSON 中的有效负载。现在是否插入或更新取决于在有效负载数据中接收到的 id。如何实例化具有 id 值的对象。
任务控制器:
async Task<Response<RequestDto>> UpdateRequest([FromBody]RequestDto req)
我必须根据请求对象的 id 值更新/插入。
我应该使用构造函数来 RequestDto 还是通过 null 检查分配 id 值
编辑
这里的 DTO 结构:
namespace MyWorkspace.ProjectA.Domain
/// <summary>
/// Request DTO
/// </summary>
public class RequestDto
/// <summary>
/// Request Id
/// </summary>
[RegularExpression(Constants.GuidRegex)]
public string RequestId get; set;
[JsonConverter(typeof(StringEnumConverter))]
public RequestDetails RequestDetails get; set;
public DateTime OpenDate get; set;
**public RequestDto()
RequestId = Guid.NewGuid().ToString("N");
**
现在我必须根据 ID 更新/插入请求,其中 2 种类型的请求有效负载可以通过以下方式:
1.
"reqId": "",
"requestDetails":
"basicDetails":
"firstName": "Something",
"lastName": "Something",
"emailAddress": "Something",
,
"addressDetails":
"addLine1": "Something",
"addLine2": "Something",
"city": "Something",
"state": "Something",
"country": "Something",
,
"openDate": "2019-07-05T09:59:18.601Z",
2.
"reqId": "0b5c7dd3931944b28f693ef8bf6fa2ad",
"requestDetails":
"basicDetails":
"firstName": "Something",
"lastName": "Something",
"emailAddress": "Something",
,
"addressDetails":
"addLine1": "Something",
"addLine2": "Something",
"city": "Something",
"state": "Something",
"country": "Something",
,
"openDate": "2019-07-05T09:59:18.601Z",
问题:我需要 DTO 中的构造函数吗?如何将 ID 分配给 DTO 对象/或者我应该分配一个新的 ID,以防空白:
public async Task<Response<RequestDto>> UpdateRequest([FromBody]RequestDto req)
req.RequestId = (req.RequestId == null || req.RequestId == "") ? Guid.NewGuid().ToString("N") : req.RequestId;
_validatorObj.ValidateAndThrow(req, ruleSet: "RequestValidation");
var result = await _repository.UpsertRequest(req);
return Response<RequestDto>.Ok(result, "Success");
代码库中的代码:
public async Task<RequestDto> UpsertRequest(RequestDto req)
var jsonReqDet = JsonConvert.SerializeObject(req.requestDetails);
var entity = _mapper.Map<RequestEntity>(req);
entity.RowKey = RequestEntity.GetRowKey(req.RequestId);
entity.PartitionKey = RequestEntity.GetPartKey(req.RequestId);
entity.RequestDetails = jsonReqDet;
entity.OpenDate = DateTime.UtcNow;
await AzureTableAdapter.Upsert(entity, RequestTableName);
return req;
注意:
-
我在有效载荷中获取整个 DTO 对象
我正在使用 Azure 存储和“插入或替换”操作
我有 requestDetils 字段作为字符串的请求表,以保留 json 值
我该怎么办?
【问题讨论】:
我不太清楚你在这里的意思。您能否更具体地说明您要做什么? id的数据类型是什么? @BhanuChhabra 字符串在这里 @RahulSharma,我已经用代码解释了我的问题 @aniruddha 您不需要在 DTO 类中使用构造函数,因为您正在接收请求。从外观上看,您为分配RequestId
所做的事情是正确的。唯一的例外可能是您的 RequestId 收到了 null
。我相信你会在你的代码中处理这个问题。
【参考方案1】:
终于
我发现我做错了什么。有效载荷包含reqId=""
。所以即使我有一个构造函数:
public RequestDto()
RequestId = Guid.NewGuid().ToString("N");
在初始化之后,由于控制器签名:
public async Task<Response<RequestDto>> UpdateRequest([FromBody]RequestDto req)
用 null 初始化的 id。所以我只从有效负载中删除了reqId(在插入期间)。我现在接受的最终有效载荷:
1.
"requestDetails":
"basicDetails":
"firstName": "Something",
"lastName": "Something",
"emailAddress": "Something",
,
"addressDetails":
"addLine1": "Something",
"addLine2": "Something",
"city": "Something",
"state": "Something",
"country": "Something",
,
"openDate": "2019-07-05T09:59:18.601Z",
2.
"reqId": "0b5c7dd3931944b28f693ef8bf6fa2ad",
"requestDetails":
"basicDetails":
"firstName": "Something",
"lastName": "Something",
"emailAddress": "Something",
,
"addressDetails":
"addLine1": "Something",
"addLine2": "Something",
"city": "Something",
"state": "Something",
"country": "Something",
,
"openDate": "2019-07-05T09:59:18.601Z",
【讨论】:
以上是关于通过 id 实例化 dto 对象,其中对象作为有效负载 C#的主要内容,如果未能解决你的问题,请参考以下文章
如何通过指定每个属性及其值来实例化 TypeScript 中的对象?
为啥通过 python 默认变量初始化变量会在对象实例化过程中保持状态?