首页 > 解决方案 > 微服务文件夹组织,使用服务和存储库

问题描述

我正在尝试了解并为我的测试微服务创建最佳方法。微服务结构如下:

应用层协调任务并委托工作。它具有命令、事件处理程序、验证...

基础设施层处理数据和其他事情。这是存储库的实现,数据库上下文,...

我需要引入一个应该从 MyTestService.API 调用的服务(我们称之为 userService)。该服务将使用存储库来获取数据。

该服务应该存储在哪里?

在基础设施层?如果是这样,如果我已经在这里使用了暴露的存储库,这有什么用?

在领域层?领域层不应该知道外部事物。

这让我的应用层成为唯一的选择。由于这是一个 web api 项目,我会将这个服务放在 Service 文件夹中。

您将如何构建您的微服务文件夹结构?

标签: .netmicroservices

解决方案


如何构建基于微服务的项目有很多可能性。我建议如下:

  • 每个微服务都在一个单独的解决方案中 将每个微服务放在一个单独的解决方案中 有很多好处。其中一些是:独立的微服务(或领域)团队,如果需要,能够为每个微服务使用不同的技术,更小的代码库等等。

  • MyTestService.Infrastructure将基础架构代码提取到一个单独的项目并从中创建一个库(nuget 包)。如果您的基础架构包含用于数据库访问、缓存交互、身份验证和类似常见功能的代码,那么您可以创建一个库并在多个微服务中重用它。在这种情况下,您的基础架构将与领域无关,并且只专注于为多个微服务提供通用解决方案。

然后,您的微服务可以在该解决方案中包含项目:

  1. MyTestService.Domain这应该包含一个特定微服务及其域的所有域/业务逻辑。在这里,您应该放置与特定微服务相关的业务逻辑代码,例如验证、命令和事件的处理程序等。该层将使用基础设施作为共享库,以执行数据库访问、缓存交互等。请记住,每个微服务都有自己的域项目。如果您使用 DDD(域驱动设计),您可以将此域项目分成多个。您可以在网上进行快速搜索。有很多如何构建 DDD 项目的示例。

  2. MyTestService.API这将是您的带有 Rest api 端点的 WebApi 项目。在这里,您将拥有控制器、ApiModel 以及引导项目所需的东西,例如依赖注入组合根等。您将在该项目的多个解决方案中使用的东西,您也可以提取到基础设施中,并在多个微服务 API(WebApi)项目中重用它。该项目将成为您的微服务入口点,让每个尝试直接调用您的微服务(例如使用 http)的人。从这里您可以将调用分发到您的 .Domain 项目中的特定代码。

  3. MyTestService.Domain.Test 和 MyTestService.API.Test。如果您编写测试,您可以添加的另一个是 MyTestService.Domain.Test 和/或 MyTestService.API.Test。在这里,您可以为您的 2 个项目放置单元和集成测试。同样,您可以将一些测试设置和通用测试基础设施放入基础设施库中。

例子

假设您有 2 个微服务用户和订单微服务。您将有 2 个解决方案(每个微服务一个)和第三种用于内部结构:

  1. 解决方案用户微服务。这将有以下项目:

    • MyOrganisation.Users.Api
    • 我的组织.用户.域
    • MyOrganisation.Users.Test
  2. 解决方案 订购微服务。这将有以下项目:

    • MyOrganisation.Orders.Api
    • 我的组织.订单.域
    • MyOrganisation.Orders.Test
  3. 基础设施

    • MyOrganisation.Infrastructure.Api - nuget 包
    • MyOrganisation.Infrastructure.DataAccess - nuget 包
    • MyOrganisation.Infrastructure.Cache - nuget 包
    • MyOrganisation.Infrastructure.Test - nuget 包

您的微服务将使用这些 nuget 包来重用数据访问和测试基础设施等常见逻辑,以避免重复,并且您的微服务将只关注业务逻辑而不是基础设施相关的事情。当您开始编写新的微服务时,您不必在每个微服务中复制基础设施代码,您可以专注于领域。随着项目的增长,您会向基础设施库添加更多常见和新的东西。

回到你的问题:

我需要引入一个应该从 MyTestService.API 调用的服务(我们称之为 userService)。该服务将使用存储库来获取数据。

该服务应该存储在哪里?

我不太清楚你在这里的意思,但让我试着回答一下。如果您的 UserService 应该是另一个服务的一部分,那么您应该重新考虑将其放入自己的微服务中。如果您从被调用的微服务中调用其他一些微服务,并且您想知道该调用应该在哪里发生。我会在你的 .Domain 项目中说。为什么?因为它与其他微服务通信以执行某些业务操作仍然是您的域的一部分。比如“为了下订单,我需要用户数据”。这仍然是订单微服务业务操作的一部分,即使它正在调用另一个微服务。现在对其他微服务的调用以及它是如何在技术上完成的,您可以在其中一个基础架构库中拥有一个通用的基础架构逻辑。


推荐阅读