【发布时间】:2015-07-09 19:59:59
【问题描述】:
我们正在研究创建一个新项目,并希望探索使用存储库和服务层模式,目的是创建可使用模拟存储库完全测试的松散耦合代码。
请看下面的基本架构思想。我们将使用接口来描述存储库并将它们注入服务层以删除任何依赖项。然后使用 autofac 我们将在运行时连接服务。
public interface IOrderRepository
{
IQueryable<Order> GetAll();
}
public class OrderRepository : IOrderRepository
{
public IQueryable<Order> GetAll()
{
return new List<Order>().AsQueryable();
}
}
public class OrderService
{
private readonly IOrderRepository _orderRepository;
public OrderService(IOrderRepository orderRepository)
{
_orderRepository = orderRepository;
}
public IQueryable<Order> GetAll()
{
return _orderRepository.GetAll();
}
}
public class EmailService
{
public void SendEmails()
{
// How do I call the GetAll method from the order serivce
// I need to inject into the orderService the repository to use
}
}
有几个问题我们无法找出最佳的前进方向。
1) 服务是否应该重现 CRUD 方法,因为看起来我们可能正在重现代码而没有真正的好处。还是 UI 应该直接调用存储库?
2) 当一个服务需要调用另一个服务时会发生什么。在上面的示例中,如果电子邮件服务需要获取所有订单,我们是否将订单服务注入到电子邮件服务中?
希望这是有道理的
【问题讨论】:
-
Email 服务不应该知道 OrderService 之类的服务,你需要 Mediator 与 Email&&Order 服务一起工作,这样它们才能解耦
-
你们的订单服务是做什么的?只封装 OrderRepository?或者它做的不止这些,从你的代码看起来它只是一个冗余层。
-
我会问另一个问题。在存储库边界之外公开 IQueryable
是否很好?对我来说,不是。这是一个有漏洞的抽象。 -
@ThomasJaskula IQueryable
完全可以模拟吗? -
@gideon 是的,但这不是重点
标签: c# design-patterns service tdd repository