C# 依赖注入与控制反转

依赖注入(Dependency Injection:DI):

        程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。

        通俗来讲,就是把有依赖关系的类放到容器中,然后在我们需要这些类时,容器自动解析出这些类的实例。

        依赖注入最大的好处时实现类的解耦,利于程序拓展、单元测试、自动化模拟测试等。

 

控制反转(Inversion of Control:IOC):

        控制反转只是一个概念,也就是将创建对象实例的控制权(原本是程序员)从代码控制权剥离到 IOC 容器 中控制。

 

IOC/DI的优缺点:

  • 优点

    • 依赖注入把对象的创造交给外部去管理,很好的解决了代码紧耦合(tight couple)的问题,是一种让代码实现松耦合(loose couple)的机制
    • 松耦合让代码更具灵活性,能更好地应对需求变动,以及方便单元测试
  • 缺点

    • 目前主流的 IOC/DI 基本采用反射的方式来实现依赖注入,在一定程度会影响性能           

依赖注入的三种形式:

    一 、构造方法注入

            目前构造方法注入是依赖注入推荐使用方式。

  • 优点

    • 在构造方法中体现出对其他类的依赖,一眼就能看出这个类需要依赖哪些类才能工作
    • 脱离了 IOC 框架,这个类仍然可以工作,POJO 的概念
    • 一旦对象初始化成功了,这个对象的状态肯定是正确的
  • 缺点

    • 构造函数会有很多参数(Bad smell)
    • 有些类是需要默认构造函数的,比如 MVC 框架的 Controller 类,一旦使用构造函数注入,就无法使用默认构造函数
    • 这个类里面的有些方法并不需要用到这些依赖(Bad smell)

代码示例:

public class FurionService
{
    private readonly IRepository _repository;
    public FurionService(IRepository repository)
    {
        _repository = repository;
    }
}

  

    二 、属性方式注入

            通过属性方式注入容易和类的实例属性混淆,不建议使用。

  • 优点

    • 在对象的整个生命周期内,可以随时动态的改变依赖
    • 非常灵活
  • 缺点

    • 对象在创建后,被设置依赖对象之前这段时间状态是不对的
    • 不直观,无法清晰地表示哪些属性是必须的

  代码示例:

public class FurionService
{
    public IRepository Repository { get; set; }
}

 

    三 、方法参数注入

            方法参数注入的意思是在创建对象后,通过自动调用某个方法来注入依赖。

  • 优点:

    • 比较灵活
  • 缺点:

    • 新加入依赖时会破坏原有的方法签名,如果这个方法已经被其他很多模块用到就很麻烦
    • 与构造方法注入一样,会有很多参数

代码示例:

public class FurionService
{
    public Person GetById([FromServices]IRepository repository, int id)
    {
        return repository.Find(id);
    }
}

 

上一篇:[转]DBCC (Transact-SQL)


下一篇:可以在打开的文件句柄上使用Linux inotify吗?