循环中的依赖项注入

本文关键字:注入 依赖 循环 | 更新日期: 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()解决方案需要更多的时间和精力来验证每一次代码更改,因此我建议在麻烦之前先实际测量一下这是一个瓶颈。