首页 > 解决方案 > 使用列表的依赖倒置在一个方法中

问题描述

如何在给定的类上实现依赖反转,如下面的代码?问题是类 A 中的函数“添加”,它包含新的关键字。

我正在使用 Autofac 进行依赖注入。

我应该创建一个在我的 Autofac 中注册的“IBFactory”,还是使用方法注入,或者完全是其他的东西?

public class A {
   List<B> _list = new List<B>();
   ILogger _logger;

   public A(ILogger logger) {  //Depency Injection using Autofac
        _logger = logger;
   }

   public Add(object X) {
        if (X is String)
           _list.Add(new B1());
        else
           _list.Add(new B2());
   }

}

public interface B {
}

public class B1 : B {
}

public class B2 : B {
}

标签: c#dependency-injectionautofacfactorydependency-inversion

解决方案


工厂委托可以用作所需类型的工厂

public class A {
    List<B> _list = new List<B>();
    private readonly ILogger logger;
    private readonly Func<B1> factory1;
    private readonly Func<B2> factory2;

    public A(ILogger logger, Func<B1> factory1, Func<B2> factory2) {  
        //Depency Injection using Autofac
        this.logger = logger;
        this.factory1 = factory1;
        this.factory2 = factory2;
   }

   public Add(object X) {
        if (X is String)
           _list.Add(factory1());
        else
           _list.Add(factory2());
   }
}

如果T在容器中注册了类型,Autofac 将自动解析依赖Func<T>作为通过容器创建T实例的工厂。

参考Autofac:委托工厂


推荐阅读