ASP.NET - 单一解决方案,MVC和WebApi项目,每个项目是否需要独立的模型?

3
我们有一个包含多个MVC Web项目的解决方案,现在要添加一个面向客户的WebApi项目。
API将是任何Web项目可用版本的大幅简化版(虽然它可能会随着时间的推移而扩展),因此我们已经到达了如何处理模型的决策点。
跨不同项目处理模型的最佳实践是什么?
我理解WebApi项目中的模型将使用某些属性,这些属性对于MVC Web应用程序来说是无意义的。例如,Display属性对于WebApi来说是无意义的,但对于视图非常有用。
这使我相信我应该为WebApi创建一个单独的模型集,但也想知道是否有什么遗漏。
我知道这可能是一个引起一系列不同意见的问题,因此我主要想了解业界认为的最佳实践。

Web API通常用于Web服务。将服务和实际应用程序分开是一个很好的做法,因此您应该使用不同的项目进行操作。如果您想确保它们独立开发,还应该拆分解决方案。 - user3038092
我们已经将API分离到了自己的项目中 - 我的问题是我们是否应该在各个项目之间共享一个模型。创建一个单一的、共享的模型库,还是为每个项目创建单独的模型库。 - McCee
1
我会使用几个模型项目,每个都有自己的目的。这样,您就可以更清晰地分离服务和应用程序(以及可能的数据库)。但是,如果必要的话,创建映射方法来映射一个模型到另一个模型时,您可能会遇到更多的代码。 - user3038092
@McCee你可以为不同的客户端应用程序(Web API / MVC Web应用程序)使用相同的领域模型。通过仓储模式将其暴露给客户端。 - Shyju
2个回答

6
在我的解决方案中,我有Web API和MVC Web应用程序,以下是我的结构: 模型:我的实体/业务对象。这些对象由Entity Framework从我的数据库创建。它们几乎与我的数据库结构相同。我的Repository方法(用于数据访问)返回单个实例/此类实例的集合。我的数据访问项目是一个独立的类库,已被引用在其他地方,如我的Web API项目等。 Web API视图模型:用于Web API接口/操作方法的视图模型(POCO类)。 MVC Web应用程序视图模型:用于我的Razor视图的视图模型(POCO类)。我甚至继承了一些Web API视图模型,并根据需要添加了其他属性。

9
Web API 对象通常不被称为 ViewModel(因为它们与视图没有关联),而是称为模型或 DTO(领域传输对象)。 - user3038092
2
Viewmodel术语被用作通用术语,解释这个对象是特定于服务于这个特定的调用(一个Razor视图或API调用)。但可能有更好的术语来描述它。 - Shyju
您所描述的解决方案,是否意味着每个项目都有一个单独的 MappingExtensions 类?(我们正在使用 AutoMapper) - McCee
@McCee:是的,因为有时您的Web应用程序视图模型与您想从Web API返回的内容不同。 - Shyju

1
我将使用单独的项目来处理DTO,以防需要使用它们的项目出现循环引用问题。
我会让WebApi项目将你的模型映射到DTO中。如果MVC项目正在使用WebAPI输出,它只需要引用DTO项目即可。这样可以避免直接引用WebAPI项目。

我认为在这种情况下,将DTO保留在单独的程序集中是最好的选择,这也是John Papa在Pluralsight的SPA课程中所做的。此外,MVC可以继承DTO以用于ModelViews目的,或进行ViewModel操作,例如:ViewData.Model = new SomeViewModel(SomeDTO),这也可以保持API和MVC DTO的同步。 - Bart Calixto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接