在长时间使用这些“东西”之后,我的建议是:
用于数据绑定的BindingModels(mvc 或 api)
用于 mvc 视图的ViewModels(您的 api 中可能有一些 mvc 页面,所以最好有一个地方,这可以是文档、介绍页面等等。如果没有视图,那么您可以有零个 ViewModels)一个这样做的好处是您可以在 Views/web.config 中拥有 ViewModels 命名空间引用,并且它不会被您的 api 资源污染。
Web api 资源的ResourceModel。在 webapi 中,嵌套资源也是树中任意位置的资源,这在 mvc 上并不常见,因此将它们命名为资源很有意义。
如果你想接收一个资源,你可以使用你的资源模型。记住你收到的和你发回的一样。
如果你想要一个自定义的输入绑定(这应该是你的默认场景)你有你的绑定模型。
如果您有任何 mvc 视图,出于管理目的、文档等,请使用您的 ViewModel。
如果你在 mvc 上有一个表单页面,你也可以在 POST 控制器上使用你的 BindingModel。无需为 MVC 或 WEBAPI 上的帖子使用不同的模型。特别是当模型绑定器或格式化程序可以使用相同的数据注释理解并映射到相同的绑定模型时。
有时,您想创建一个包含资源和一些额外字段的绑定模型。继承是你的朋友。
有时您想创建具有多个资源和(可选地,额外字段)资源作为属性的绑定模型是您的朋友。
在 MVC 世界中,您也可以使用“资源”的概念,但它不太常见。当您在同一个项目中使用 MVC 和 Web Api 时,这会派上用场。
如果您需要对任何项目(如文件夹结构、命名空间等)进一步评论,请告诉我。我非常乐意分享我的利弊经验。
哦,我忘了,映射策略值得研究。我个人做我自己的映射,但是把这个逻辑放在一个地方是无价的。
编辑:非常天真的例子
ContactViewModel{
string Name {get;}
string LastName {get;}
List<Country> AvailableCountries {get;}
Country Country {get;}
bool IsAdmin {get;}
}
ContactBindingModel{
string Name {get;set;}
string LastName {get;set;}
int Country {get;set;}
}
ContactResourceModel{
string Name { get;set;}
string LastName {get;set;}
Country Country {get;set;}
string IsAdmin {get;}
}