0

如何调整现有的表单类:

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因为它会更明确。

4

2 回答 2

2

在 DI 中,接口充当关于依赖项的合同。正如你所说,将会存在

IDependency2 的实例数量不可预测

对于任何类型的注入集合,这都为我尖叫

例子:

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

    }
}
于 2012-11-16T14:56:35.977 回答
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 。我不知道你为什么首先添加它。请注意,工厂的强大之处在于您可以添加更复杂的实现,而不仅仅是使用无参数构造函数创建对象。寻找不同的工厂模式。流行的是工厂方法和抽象工厂。

于 2012-11-16T18:59:45.407 回答