我有一个 API 可以更新已经存在的实体。该实体可以通过 API 存在的界面手动更新。
我的问题是关于如何仅更新供应商可能通过实体上的 API 发送的某些字段的良好设计模式或架构是什么?我不想用 NULL 或空字符串覆盖字段,只是因为它们在发送到 API 时不知道这些值,但数据库中的实体可能已经有该字段的值。
如果供应商想要将字段重置为某种空字符串,还应该考虑到这一点。
实体API模型
ID
Name
TwitterHandle
具有值的实体数据库模型
ID = 200
Name = Hello
TwitterHandle = @hello
实体请求模型将值发送到 API
ID = 200
Name = Hello2
此请求应仅将名称更新为 Hello2,而保留 TwitterHandle。但是,在另一个请求中,如果发送了某些内容(NULL,空字符串),他们可以重置 TwitterHandle
我们过去做过的一件事是创建一个端点“http://webapi.com/twitter/200/name”,然后执行包含更新值的 put。它并不完美,但它可以完成工作并且非常容易实现。
如果您想在 API 级别执行此操作,则可以使用 HttpPatch,如下所示
public void Patch(Guid id, JsonPatchDocument<SomeDto> patch) {
// Perform validation
var objectToUpdate = repo.GetById(id); // replace this with your database call
patch.ApplyUpdatesTo(objectToUpdate);
repo.Save(objectToUpdate); // save it to database
}
我会采取的另一种方法是使用 Automapper。我将创建 dto 对象和 automapper 映射类,它将 dto 转换为数据库模型。这样您也将遵循单一责任原则,因为您的映射将成为自动映射器配置的责任