c# – 我对界面感到困惑吗?

我正在维护一个ASP.NET MVC项目.在该项目中,原始开发人员拥有绝对大量的接口.例如:IOrderService,IPaymentService,IEmailService,IResourceService.我感到困惑的是,每个都只能由一个类实现.换一种说法:

OrderService : IOrderService
PaymentService : IPaymentService

我对接口的理解一直是它们被用来创建一个可以轻松互换组件的架构.就像是:

Square : IShape
Circle : IShape

此外,我不明白这些是如何被创建和使用的.这是OrderService:

public class OrderService : IOrderService
{
    private readonly ICommunicationService _communicationService;
    private readonly ILogger _logger;
    private readonly IRepository<Product> _productRepository;

    public OrderService(ICommunicationService communicationService, ILogger logger,
        IRepository<Product> productRepository)
    {
        _communicationService = communicationService;
        _logger = logger;
        _productRepository = productRepository;
    }
}

这些对象似乎不会直接创建,因为在OrderService orderService = new OrderService()中它总是使用该接口.我不明白为什么使用接口而不是实现接口的类,或者它是如何工作的.有什么重要的东西,我缺少关于我的谷歌技能没有发现的接口?

最佳答案
这种特殊的设计模式通常用于促进单元测试,因为您现在可以用TestOrderService替换OrderService,这两者都只被引用为IOrderService.这意味着您可以编写TestOrderService来为被测试的类提供特定的行为,然后检测被测试的类是否正在执行正确的操作.

在实践中,上面的操作通常是通过使用Mocking框架来完成的,因此您实际上并不手动编写TestOrderService代码,而是使用更简洁的语法来描述它应该如何处理典型测试,然后使用模拟框架动态生成一个实现.

至于为什么你从来没有在代码中看到’new OrderService’,你的项目可能正在使用某种形式的Inversion of Control容器,这有利于自动依赖注入.换句话说,您不必直接构造OrderService,因为您已经配置了通过构造单个OrderService并将其传递给构造函数来自动满足任何IOrderService使用的地方.这里有很多细微之处,我不确定你的依赖注入是如何完成的(它不必是自动的;你也可以手动构造实例并通过构造函数传递它们.)

转载注明原文:c# – 我对界面感到困惑吗? - 代码日志