一个模块的业务层可以直接访问另一个模块的repository吗?

Posted

技术标签:

【中文标题】一个模块的业务层可以直接访问另一个模块的repository吗?【英文标题】:Can business layer of one module directly access repository of another module? 【发布时间】:2017-09-03 19:57:48 【问题描述】:

我有一个 3 层架构。

1) C# MVC 应用程序 - UI 层

2) 业务层 - 由服务接口及其实现和存储库接口组成

3) 数据访问层 - 由 Repository 接口实现组成

应用程序分为不同的模块。模块只不过是一个 C# 类库。每个模块都有自己的业务层和数据访问层。层之间存在松散耦合,因此每一层仅通过接口访问另一层。举个例子,下面是应用程序的堆叠方式

// UI layer
public class UserController: Controller 

   IUserService userService;
   IOrderService orderService;

   public UserController(IUserService userService, IOrderService orderService)
     this.userService = userService;
     this.orderService  = orderService;
   


//Business layer - User module
public class UserService: IUserService

   IUserRepository userRepository;
   IOrderRepository orderRepository;

   public UserService(IUserRepository userRepository, IOrderRepository 
   orderRepository)
      this.userRepository = userRepository;

      //Should this be here or replaced by order service ?
      this.orderRepository = orderRepository;
   


//Business layer - Order module
public class OrderService: IOrderService

   IOrderRepository orderRepository;

   public UserService(IOrderRepository orderRepository)
      this.orderRepository= orderRepository;
   


//Data access layer - User module

public class UserRepository: IUserRepository 


//Data access layer - Order module

public class OrderRepository: IOrderRepository 

用户服务可以直接访问订单存储库还是只依赖订单服务?

【问题讨论】:

最好使用服务而不是存储库,因为服务在执行任何数据库操作之前需要执行业务逻辑。但是在这里你需要小心,两个服务不应该相互依赖,否则你最终会陷入僵局。 【参考方案1】:

您正在UserService 中访问IOrderRepository。你的问题是这是否是正确的方法,或者它应该只访问IUserRepository 并调用OrderService 而不是IOrderRepository

IMO,任何服务都可以根据需要调用任何存储库。 Service 和 Repository 之间没有1 <-> 1 关系。

存储库为您提供对数据的访问。如果在多个服务中需要这样的访问,那么多个服务可以使用同一个存储库。这看起来非常干净且易于解释。

【讨论】:

感谢您的详细解答。虽然我还有 1 个:是否可以同时访问另一个模块的存储库和服务?例如,在我的情况下,UsersService 需要OrdersRepositoryOrdersService?或者是难闻的气味?提前致谢 @MyTitle: IMO: 1) 在 分层架构 的情况下,访问另一个服务应该不是问题。它实际上有助于代码重用。不过,这种用法应该是最少的。 2) 对于 DDD 架构,这绝对是代码异味,因为在这里,域服务是绑定上下文的一部分。如果您需要在一项服务中访问不同的服务,可能是您的绑定上下文设计不当。这里更好的解决方案是使用领域事件或 DDD 提供的其他一些工具。希望对您有所帮助。

以上是关于一个模块的业务层可以直接访问另一个模块的repository吗?的主要内容,如果未能解决你的问题,请参考以下文章

耦合与内聚分类

maven一项目多模块开发

VIPER 架构

用 Spring Boot 实现电商系统 Web API 创建多模块项目

如何将文件夹从 git repo 链接到另一个 repo?

自己负责的模块