通过 id 实例化 dto 对象,其中对象作为有效负载 C# 接收

Instantiate dto object by id where object received as payload C#

在 DTO JSON 中有一个任务控制器函数接收负载。现在是插入还是更新是基于有效载荷数据中收到的 id。如何实例化id值对象

任务控制器:

async Task<Response<RequestDto>> UpdateRequest([FromBody]RequestDto req)

我必须 update/insert 基于请求对象 ID 值。

我应该使用构造函数来 RequestDto 还是通过 null 检查分配 id 值

EDIT

这里的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");
        }**
    }
}

现在我必须 update/insert 基于 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;
}

注:

  1. 我正在有效负载中获取整个 DTO 对象
  2. 我正在使用 Azure 存储和 "InsertOrReplace" 操作
  3. 我有请求 table,其中 requestDetils 字段为字符串,以保持 json 值

我该怎么办?


终于

我发现我做错了什么。有效负载包含 reqId=""。所以即使我有一个构造函数:

public RequestDto()
{
    RequestId = Guid.NewGuid().ToString("N");
}

在初始化之后,由于控制器签名:

public async Task<Response<RequestDto>> UpdateRequest([FromBody]RequestDto req)

id初始化为null。所以我只从有效负载中删除了 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",
}