use*_*218 11 c# tdd service design-patterns repository
我们正在研究创建一个新项目,并希望探索使用Repository和Service层模式,目的是创建松散耦合的代码,使用模拟存储库完全可测试.
请参阅下面的基本架构构思.我们将使用接口来描述存储库,并将这些接口注入服务层以删除任何依赖项.然后使用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
}
}
Run Code Online (Sandbox Code Playgroud)
我们在找到最佳前进方法时遇到了一些问题.
1)服务是否应该再现CRUD方法,因为看起来我们可能正在复制代码而没有真正的好处.或者UI应该直接调用存储库吗?
2)当服务需要调用另一个服务时会发生什么.在上面的示例中,如果电子邮件服务需要获取所有订单,我们是否将订单服务注入电子邮件服务?
希望这是有道理的
电子邮件服务不应该知道像 OrderService 这样的服务,您需要Mediator与 Email&&Order 服务一起使用,以便它们解耦,或者需要AdapterIOrder来适应IEmail:
IEnumerable<IOrder> orders = orderService.GetAll();
// TODO: Create emails from orders by using OrderToEmailAdaptor
IEnumerable<IEmail> emails = ...
emailService.SendEmails(emails);
public sealed class EmailService
{
public void SendEmails(IEnumerable<IEmail> emails)
{
}
}
Run Code Online (Sandbox Code Playgroud)
调解员:
定义一个对象来封装一组对象如何交互。中介器通过防止对象显式地相互引用来促进松散耦合,并且它允许您独立地改变它们的交互
适配器:
适配器模式(通常称为包装器模式或简称为包装器)是一种设计模式,它将类的一个接口转换为兼容的接口