【问题标题】:ASP.NET - Single Solution, MVC and WebApi projects, Separate Models for Each?ASP.NET - 单一解决方案、MVC 和 WebApi 项目、各自的模型?
【发布时间】:2024-06-19 02:50:02
【问题描述】:

我们有一个包含多个 MVC Web 项目的解决方案,现在添加了一个面向客户端的 WebApi 项目。

API 将是任何 Web 项目中可用内容的更缩小版本(尽管随着时间的推移它可能会扩展得更多),因此我们已经就如何处理模型。

在不同项目中处理模型的最佳做法是什么?

据我了解,例如,WebApi 项目中的模型将使用某些对 MVC Web 应用程序毫无意义的属性属性。再举个例子,Display 属性对 WebApi 没有意义,但在 View 中非常有用。

这让我相信我应该为 WebApi 创建一组单独的模型,但我也想知道我是否遗漏了什么。

我知道这可能是一个可能会引发各种意见的问题,所以我主要在寻找被认为是行业最佳做法的问题。

【问题讨论】:

  • Web API 通常用于 Web 服务。将您的服务和您的实际应用程序分开绝对是一个好习惯,因此您应该为此使用不同的项目。如果您想确保它们是独立开发的,您还应该拆分解决方案。
  • 我们已经将 API 分离到它自己的项目中——我的问题是我们是否应该在各个项目之间共享一个模型。创建单个共享模型库,而不是为每个项目创建单独的模型库。
  • 我会使用几个模型项目,每个项目都有自己的用途。这样,您就可以在服务和应用程序(可能还有数据库)之间进行更清晰的分离。但是,如果需要,您可以通过创建映射方法将一个模型映射到另一个模型来运行更多代码。
  • @McCee 您可以为各种客户端应用程序(web api/ mvc web 应用程序)使用相同的域模型。通过存储库模式将其公开给客户端。

标签: c# asp.net-mvc asp.net-web-api


【解决方案1】:

在我有 Web API 和 MVC Web 应用程序的解决方案中,我有以下结构

模型:我的实体/业务对象。这些是由我的数据库中的实体框架创建的。这些与我的数据库结构几乎相同。我的存储库方法(用于数据访问)返回此类实例的单个实例/集合。我的数据访问项目是一个单独的类库,已在我的 web api 项目等其他地方引用过。

Web API ViewModels:特定于 Web API 接口/操作方法的 Viewmodels(POCO 类)。

MVC Web 应用 ViewModels :特定于我的 Razor 视图的 Viewmodels(POCO 类)。 我什至从 Web API 视图模型中继承了其中的一些属性,并根据需要添加了其他属性。

【讨论】:

  • Web api 对象通常不称为 ViewModel(因为它们不绑定到视图),而只是模型或 DTO(域传输对象)。
  • Viewmodel 术语用作通用术语,解释此对象特定于服务此特定调用(剃刀视图或 api 调用)。但可能有一个更好的术语。
  • 使用您描述的解决方案,这是否意味着您每个项目都有一个单独的 MappingExtensions 类? (我们正在使用 AutoMapper)
  • @McCee :是的,因为有时您的 Web 应用视图模型与您希望从 Web API 返回的不同。
【解决方案2】:

我为 DTO 使用单独的项目,以便需要使用它们的项目不会遇到循环引用问题。

我会让 WebApi 项目将您的模型映射到 DTO。如果您的 MVC 项目正在使用 WebAPI 输出,则它只需要对 DTO 项目的引用。这使您不必直接引用 WebAPI 项目。

【讨论】:

  • 我同意在这种情况下最好将 DTO 保存在单独的程序集中,这也是 John Papa 在复数视觉的 SPA 课程中的做法。此外,MVC 可以从 DTO 继承用于 ModelViews 或进行 ViewModel 操作,例如:ViewData.Model = new SomeViewModel(SomeDTO) 并保持 API 和 MVC DTO 同步。