我使用Entity框架开发Web应用程序。
我的DbContext里面有一个DbSet - 字母表。
控制器方法将db对象作为参数是一种好习惯。含义:
[HttpPost]
Public IHttpActionResult SendLetter(Letter letterToSend)
目前正在使用一封直接数据库模型。 它应该改成不同的型号并在以后投射吗?
答案 0 :(得分:1)
使用Code First的实体框架至少可以将数据对象(dbobject)用作POCO域模型对象。我们实际上并不认为它主要是数据对象。它们被认为是域模型就是这样。
因此,不是将db-object用作控制器操作参数,问题就变成“我可以直接在控制器操作参数中使用域模型吗?”一个db-object到controller参数肯定是第一眼看不到的。但是使用域模型作为操作参数:
意见当然会有所不同,并且不会阻止您在action参数中使用域模型。如果API正在处理由域模型100%表示的资源,那么实际上没有任何害处。
话说回来,很多时候,现实世界的应用往往变得复杂。创建了它们的多个版本,因此v1支持10个字母字段,而v2可以支持12个字段。此外,还有特定的验证规则,您可能希望在某些类型的输入上运行。除此之外,并非所有请求都映射到域模型。 (补丁请求,部分更新,复合模型等)
随着API的成熟,您不希望在一个API方法中进行少量更改,从而影响多个API,因为所有这些输入模型都会受到此处更改的影响。
因此,更安全的选择是在控制器级别为对象使用单独的“ResourceModel”设计。它们可以手动或使用AutoMapper等框架轻松映射到/从域模型映射。是的,它很繁琐,但从长远来看可以帮助您隔离验证,目标有效负载,v1 v2特定模型等。
这完全基于十多年服务开发的个人经验,正如我所说,意见各不相同。