如何调整表单的现有类:
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
的人相互讨论过这个问题,因为它会更明确。
答案 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。我不知道为什么你首先添加它。请注意,关于工厂的强大之处在于,您可以添加更复杂的实现,而不是简单地使用无参数构造函数创建对象。寻找不同的工厂模式。流行的是工厂方法和抽象工厂。