循环中的依赖项注入
本文关键字:注入 依赖 循环 | 更新日期: 2023-09-27 18:28:00
为了使ParentClass
不依赖于MyClass
,以下操作的正确方法是什么?
public class ParentClass
{
public void MyFunction(IList<Foo> foos)
{
foreach (var bar in foos)
{
var myClass = new MyClass();
myClass.DoStuff();
}
}
}
通常,如果没有循环,我只会用ParentClass构造函数将其注入,但在这里,我需要为循环的每次迭代都有一个新的实例。
或者也许有更好的方法来实现我想要实现的目标?也许myClass可以在每次迭代结束时重置自己,这样我就可以重用它了?
您可以将创建MyClass实例的工厂对象注入ParentClass。
对于每个循环迭代,您都会调用工厂对象,以便它为您提供一个MyClass的新实例。
您可以在构造函数中注入Func<IMyClass>
,然后根据需要多次调用它以获得不同的实例。
像Autofac这样的IoC框架本身就支持这一点。
这实际上取决于您想用MyClass做什么。目前,foo、bar和MyClass之间没有相关性。假设您要将bar注入MyClass的Ctor,或者将其作为参数传递给DoStuff,那么我只需将一个工厂类或方法注入ParentClass Ctor,并使用它来代替新的MyClass。
您提出的注入可读、易懂,并且易于验证其正确性。
如果循环很大,或者MyClass
的创建成本很高(例如打开连接、文件句柄、子进程或启动线程),则可以选择重置对象。
由于reset()
解决方案需要更多的时间和精力来验证每一次代码更改,因此我建议在麻烦之前先实际测量一下这是一个瓶颈。