一个模块的业务层可以直接访问另一个模块的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
需要OrdersRepository
和OrdersService
?或者是难闻的气味?提前致谢
@MyTitle: IMO: 1) 在 分层架构 的情况下,访问另一个服务应该不是问题。它实际上有助于代码重用。不过,这种用法应该是最少的。 2) 对于 DDD 架构,这绝对是代码异味,因为在这里,域服务是绑定上下文的一部分。如果您需要在一项服务中访问不同的服务,可能是您的绑定上下文设计不当。这里更好的解决方案是使用领域事件或 DDD 提供的其他一些工具。希望对您有所帮助。以上是关于一个模块的业务层可以直接访问另一个模块的repository吗?的主要内容,如果未能解决你的问题,请参考以下文章