C#服务层设计模式

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)当服务需要调用另一个服务时会发生什么.在上面的示例中,如果电子邮件服务需要获取所有订单,我们是否将订单服务注入电子邮件服务?

希望这是有道理的

sll*_*sll 6

电子邮件服务不应该知道像 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)

调解员

定义一个对象来封装一组对象如何交互。中介器通过防止对象显式地相互引用来促进松散耦合,并且它允许您独立地改变它们的交互

适配器

适配器模式(通常称为包装器模式或简称为包装器)是一种设计模式,它将类的一个接口转换为兼容的接口