首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微服务文件夹组织,将服务与存储库一起使用

微服务文件夹组织,将服务与存储库一起使用
EN

Stack Overflow用户
提问于 2019-09-04 19:23:39
回答 1查看 1.1K关注 0票数 1

我正在努力理解并为我的测试微服务创建最好的方法。小额服务的结构如下:

  • MyTestService.API //表示应用层
  • MyTestService.Domain //表示域层
  • MyTestService.Infrastructure //表示基础设施层

应用层协调任务并委派工作。它有命令,EventHandlers,验证,

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

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

这个服务应该存放在哪里?

在基础设施层?如果是这样的话,如果我已经在这里使用公开的存储库,这有什么用呢?

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

这使我只能选择应用层。因为这是一个web项目,所以我会把这个服务放在服务文件夹中。

如何构造微服务文件夹结构?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-08 18:27:19

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

  • 每个微服务在一个单独的解决方案中,在一个单独的解决方案中每个微服务都有多个好处。其中一些是:独立的微服务(或域)团队,能够在需要时为每个微服务使用不同的技术,更小的代码库等等。
  • MyTestService.Infrastructure将基础设施代码提取到一个单独的项目中,并从它创建一个库(nuget包)。如果您的基础设施包含用于数据库访问、缓存交互、身份验证和类似的公共功能的代码,那么您可以创建一个库并在多个微服务中重用它。在这种情况下,您的基础设施将是与域无关的,并且只会专注于为多个微服务提供共同的解决方案。

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

  1. MyTestService.Domain --这应该包含特定微服务及其域的所有域/业务逻辑。在这里,您应该放置与特定的微服务相关的业务逻辑代码,比如验证、命令和事件的处理程序等等。该层将使用基础设施作为共享库,以执行数据库访问、缓存交互和类似操作。请记住,每个微服务都有自己的域项目。如果使用DDD(域驱动设计),则可以将此域项目分隔为多个。你可以在网上快速搜索。DDD项目的结构有很多例子。
  2. MyTestService.API --这将是带有Rest端点的WebApi项目。在这里,您将拥有控制器、ApiModels以及引导项目所需的东西,如依赖项、注入、组合、根等。您将在这个项目的多个解决方案中使用的东西,您也可以将其提取到基础设施中,并在多个微服务API(WebApi)项目中重用它。这个项目将成为你的微服务的切入点,让每个人都能直接调用你的微服务,比如使用http。从这里开始,您将分发对.Domain项目中特定代码的调用。
  3. MyTestService.Domain.Test和MyTestService.API.Test.如果您编写测试,可以添加的另一个测试是MyTestService.Domain.Test和/或MyTestService.API.Test。在这里,您可以为您的2个项目放置单元和集成测试。同样,您可以拥有一些测试设置和公共测试基础结构,您可以将它们放入基础结构库中。

示例

假设您有2个微服务用户,并订购微型服务。您将有两个解决方案(每个微服务一个)和第三个内部结构解决方案:

  1. 解决方案用户微型服务。这将包括以下项目:
代码语言:javascript
复制
- MyOrganisation.Users.Api
- MyOrganisation.Users.Domain
- MyOrganisation.Users.Test

  1. 解决方案订购微型服务。这将包括以下项目:
代码语言:javascript
复制
- MyOrganisation.Orders.Api
- MyOrganisation.Orders.Domain
- MyOrganisation.Orders.Test

  1. 基础设施
代码语言:javascript
复制
- MyOrganisation.Infrastructure.Api - nuget package
- MyOrganisation.Infrastructure.DataAccess - nuget package
- MyOrganisation.Infrastructure.Cache - nuget package
- MyOrganisation.Infrastructure.Test - nuget package

您的微服务将使用这些nuget包来重用公共逻辑,如数据访问和测试基础结构,以避免重复,而您的微服务将只关注业务逻辑,而不关注与基础设施相关的事情。当您编写新的微服务时,您不必在每个微服务中重复基础结构代码,您可以专注于域。随着项目的增长,您可以向基础结构库添加更多的公共和新内容。

回到你的问题:

我需要引入一个应该从userService调用的服务(让我们称之为userService),这个服务将使用存储库来获取数据。 这个服务应该存放在哪里?

我不太清楚你在这里的意思,但让我试着回答。如果您的UserService应该是另一个服务的一部分,那么您应该重新考虑将它放在它自己的微服务中。如果您正在从您的微服务中调用其他的微服务,并且您想知道这个呼叫应该发生在哪里。我想在你的.Domain项目中说。为什么?因为它与其他微服务进行某些业务操作的通信仍然是您的域的一部分。比如“为了下订单,我需要用户数据”。尽管如此,这仍然是订单微型服务业务运作的一部分,即使它正在调用另一个微服务。现在,对其他微服务的调用以及在技术上是如何实现的,您可以在其中一个基础设施库中拥有一个公共的基础结构逻辑。因为从另一个微服务中调用一个微服务,或者在它们之间使用某种类型的通信,同步或异步是大多数微服务所需要的,所以您应该将这个公共部分提取到基础结构代码中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57794664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档