【问题标题】:Conventions on having both an API and MVC project in .NET Core solution在 .NET Core 解决方案中同时拥有 API 和 MVC 项目的约定
【发布时间】:2019-09-28 03:36:58
【问题描述】:

我有一个包含以下项目的 ASP.NET Core (.NET Core 2.2) 应用程序:

  • API:这是为了表示一个 WebAPI(控制器继承 ControllerBase
  • 服务:这包含 API 控制器用来访问数据库等的服务
  • 数据库:这包含常用的数据库存储库,服务层利用这些存储库访问数据库

现在,我想添加一个与 API 对话的 UI(MVC 部分 pre-.NET-core)。 .NET Core 是如何实现的,其中 MVC 和 WebAPI 是一回事? MVC 控制器/模型/视图是否应该成为 API 的一部分?它应该是一个侦听不同端口的新项目吗?身份验证如何适用于两者(例如,API 通常具有一些基于令牌的身份验证,UI 应用程序通常具有用户名/密码身份验证)? WebAPI 和 MVC 部分是否应该像 ASP.NET 身份一样共享相同的身份验证?如果他们使用同一个数据库,这两者不会紧密结合吗?

对于如何构建此类项目,是否有某种 Microsoft 或社区建议的约定/文档?

【问题讨论】:

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


    【解决方案1】:

    在 MVC 和 WebAPI 是一回事的 .NET Core 中如何实现这一点?

    在 dotnet core 中,MVC 和 WebAPI 可以存在于同一个项目中。 Everything 应用程序就像一个控制台应用程序。您可以将 MVC 服务添加到启动类中,使其成为 MVC 应用程序。

    MVC 控制器/模型/视图是否应该成为 API 的一部分?

    最好分别为 MVC 和 WebAPI 相关功能设置不同的控制器,同时将它们保存在同一个文件夹中。

    模型 - 它们可以用于 mvc 和 webapi。视图模型和 DTO 也是如此。

    视图 - 仅对于 MVC,webapi 不需要视图。

    应该改为监听不同端口的新项目吗?

    是的,您可以为 webapi 和 MVC 创建不同的项目。

    身份验证如何适用于两者(例如 API 通常有一些基于令牌的身份验证,UI 应用通常有用户名/密码身份验证)?

    如果您使用基于令牌的身份验证,那么 Web API 和 MVC 都可以使用。

    WebAPI 和 MVC 部分是否应该像 ASP.NET Identity 一样共享相同的身份验证?如果他们使用同一个数据库,这不会将两者紧密结合吗?

    如果您将 ASP.Net Identity 与身份服务器一起使用,则 MVC 和 webapi 将能够共享相同的身份验证机制而无需紧密耦合。

    【讨论】:

      【解决方案2】:

      与 MVC 相比,我认为您对 WebAPI 有点困惑。

      您可以将 WebAPI 视为使用数据响应 http 请求的简单 Web 服务(无论数据是什么,它甚至可以包括 javascript 或资产)。

      编辑: 因此,发送“UI”信息绝对是您的 API 和服务项目的一部分。

      在 API 上,您需要创建专用控制器来发回您的“UI”部分。 在服务上,您需要创建专门的服务来获取“UI”信息(他们有很多方法可以做到这一点,使用资源、在云端获取数据等)

      编辑2: 但是没有什么能阻止您为 UI 部件创建一个完全不同的解决方案。如果您再次选择 WebAPI,您仍然需要强制执行前面提到的 API/服务逻辑。你可以选择任何你觉得舒服的东西。

      【讨论】:

      • 你能谈谈如何share the same authentication...吗?
      【解决方案3】:

      您的问题的答案主要是“这取决于您的口味”,但在我看来...

      除非您计划将 API 公开给其他应用程序,否则请将 API 控制器保留在托管 MVC 控制器(或 Razor 页面)的同一应用程序中。当我同时拥有 MVC 控制器和 API 控制器时,我将它们放在单独的文件夹下。我认为这没关系,因为您的控制器应该很薄。我通常将所有业务逻辑(包括任何必要的数据访问)放在构建在单独类库中的服务中。

      【讨论】:

      • 谢谢 Glenn,我想我会将两种类型的控制器放在同一个程序集中的不同文件夹下。您将如何为这两种类型的控制器构建身份验证?只是在他们共享的数据库中搭建了 ASP.NET 标识?另外,MVC 控制器应该如何与 API 控制器通信?
      • 您可以使用 HttpClient 从 MVC 控制器调用 API 控制器端点。
      【解决方案4】:

      只有在您真正需要时才添加 API。

      您是否打算向其他应用公开任何内容?

      如果您想要的只是与数据库交互的 UI,那么请不要打扰,使用服务来检索数据,从 MVC 控制器调用它们并完全跳过 API 部分。

      对于这种有限的用例,您不需要 API。 API 引入了许多其他需要考虑的事情,例如身份验证和安全性。 不需要的时候不要把事情复杂化。

      【讨论】:

      • 嗨安德烈,这完全有道理。我在想一个额外的抽象将有助于解决方案的未来发展(例如,其他人可能想要开发一些附加工具来插入 api 来执行操作)
      • 如果您继续按照目前的方式开发,使用单独的服务,那么在未来的某个时候,您可以毫无问题地添加 API。
      猜你喜欢
      • 2017-06-04
      • 2013-09-06
      • 2015-06-05
      • 1970-01-01
      • 2021-04-19
      • 2019-08-10
      • 2021-09-07
      • 2019-10-26
      • 1970-01-01
      相关资源
      最近更新 更多