通过 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 默认变量初始化变量会在对象实例化过程中保持状态?

DTO(数据传输对象)介绍与实例

使用 linq to sql 后端通过 WCF 查询 DTO 对象

如何在避免复杂对象的情况下将 dto 映射到实体