适应构造函数注入 - 如何从参数到工厂?

时间:2012-11-16 14:48:45

标签: c# dependency-injection

如何调整表单的现有类:

public class A
{
    A(IDependency1 obj1, IDependency2 obj2)
    {
      // ...
    }
}

这样的事情:

public class A
{
    private List<IDependency2> _things;

    A(IDependency1 obj1)
    {
        _things = new List<IDependency2>();
        foreach (var x in someCollection)
            _things.Add(NewInstanceOf<IDependency2>());
    }
}

关键是在第一个示例obj2中是IDependency2的单例实例。在第二个示例中,创建了不可预测数量的IDependency2实例。

我考虑过在构造函数中有一个Func<IDependency2>参数,但是我和一个建议使用IDependencyResolver的人相互讨论过这个问题,因为它会更明确。

2 个答案:

答案 0 :(得分:2)

在DI中,接口充当关于依赖关系的契约。 正如你所说的那样存在

  

IDependency2

的不可预测数量的实例
对于任何类型的注入集合,这都会让我感到尖叫

示例:

interface IDependency2List
{
    IEnumerable<IDependency2> Items;
}
interface IDependency2
{
    //bla
}
public class A
{
    public A(IDependency1 dep1, IDependency2List dep2List)
    {

    }
}

答案 1 :(得分:0)

您可以添加工厂界面,如:

public interface IDependencyFactory<T> where T : class, new()
{
    T Create();
}

一个简单的实现:

public class SimpleDependencyFactory<T> where T : class, new()
{
    public T Create()
    {
        return new T();
    }
}

然后你的类构造函数将工厂作为参数:

public class A
{
    private List<IDependency2> _things;

    public A(IDependency1 obj1, IDependencyFactory<IDependency2> dep2Factory)
    {
        _things = new List<IDependency2>();
        foreach (var x in someCollection)
            _things.Add(dep2Factory.Create());

    }
}

由于someCollection,这不会编译。在你的例子中也从不使用obj1。我不知道为什么你首先添加它。请注意,关于工厂的强大之处在于,您可以添加更复杂的实现,而不是简单地使用无参数构造函数创建对象。寻找不同的工厂模式。流行的是工厂方法和抽象工厂。