IoC vs Services / Singletons

时间:2018-04-17 02:56:00

标签: c# .net dependency-injection inversion-of-control

我试图理解IoC容器的价值,将依赖关系注入需求类型,而不是使用更经典的静态服务或单例方法。

问题:使用IoC容器有哪些明显优势?

据我所知:

优点:

  • 单点配置
  • 改进了应用程序可测试性(例如Moq框架)
  • 更容易处理变更(不依赖于具体类型,而是接口允许更容易的变更控制 - 例如交换日志服务不应该要求应用程序范围的代码更改)

缺点:

  • 学习曲线
  • 更多接口?

以下是两者的代码示例:

// Statics & singletons
public class MyClass
{
    public void DoStuff()
    {
        Service.DoSomething(); // static method call
        Singleton.Instance.DoSomething(); // singleton method call
    }
}

// IoC
public class MyClass
{
    IService service;
    IAnotherService anotherService;

    // Depencies are injected by an IoC container..
    public MyClass(IService service, IAnotherService anotherService)
    {
        this.service = service;
        this.anotherService = anotherService;
    }

    public void DoStuff()
    {
        service.DoSomething();
        anotherService.DoSomething();
    }
}

1 个答案:

答案 0 :(得分:2)

原因#1。它通过解耦组件来增强模块化。通过引入通用接口,两个软件组件,通过通用接口提供和使用服务。您可以轻松地交换提供商,而不会打破您的消费者。

原因#2可测试性。想象一下,“服务”和“另一个服务”是一个完整的系统,如地图服务。为类创建单元测试时,您希望单元测试尽可能简单且独立。使用IoC,您可以在单元测试中替换自己简单的Service和AnotherService实现。