You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core创建实体时客户端应传什么?是否需拆分模型?

ASP.NET Core API输入模型的最佳实践

创建仅包含客户端可提交字段的专用模型是最佳实践,这并非冗余,而是合理的职责划分,核心原因如下:

  • 从根源杜绝非法输入:你当前的写法中,客户端仍能提交ID和CreationTime字段,虽然控制器会覆盖这些值,但存在逻辑漏洞风险(比如后续代码修改时遗漏覆盖逻辑)。专用输入模型只开放允许客户端提交的字段,彻底避免这类问题。
  • 关注点分离:你的MyModel属于实体模型,负责映射数据库表结构;专用输入模型(如CreateMyModelRequest)负责定义API的输入契约。两者职责清晰,后续修改数据库结构不会影响API输入规范,反之亦然。
  • 适配多场景需求:不同API场景(创建、更新、查询)对字段的需求不同,比如更新场景可能不需要CreationTime,查询场景可能需要返回更多字段。为每个场景定义专用模型,能灵活控制字段的暴露和验证规则。

这类辅助类的称谓

这类用于API输入/输出的辅助类,通常称为数据传输对象(DTO,Data Transfer Object),也可以更具体地称为请求模型(Request Model)或输入模型(Input Model),以此区分用于数据库映射的实体模型。

代码示例

输入模型(仅包含可提交字段)

public class CreateMyModelRequest
{
    public string Name { get; set; }
}

修改后的控制器代码

[Route("api/[controller]")]
public class IntermediaryController : ControllerBase
{
    private readonly IStorage _storage;

    public IntermediaryController(IStorage storage)
    {
        _storage = storage;
    }

    [HttpPost]
    public async Task<ActionResult<MyModel>> Create(CreateMyModelRequest request)
    {
        var entity = new MyModel
        {
            ID = Guid.NewGuid(),
            CreationTime = DateTime.Now,
            Name = request.Name
        };

        var createdEntity = await _storage.Create(entity);
        return CreatedAtAction(nameof(Get), new { id = createdEntity.ID }, createdEntity);
    }

    [HttpGet("{id}")]
    public async Task<ActionResult<MyModel>> Get(Guid id)
    {
        var entity = await _storage.GetById(id);
        return entity == null ? NotFound() : entity;
    }
}

额外优化建议

如果担心多个模型带来的维护成本,可以使用AutoMapper等映射工具,简化输入模型到实体模型的转换,减少手动赋值的重复代码。

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:10:34