循环中的依赖注入

时间:2012-03-15 16:41:33

标签: c# dependency-injection

执行以下操作的正确方法是什么,以便ParentClass不依赖于MyClass

public class ParentClass
{
    public void MyFunction(IList<Foo> foos)
    {
        foreach (var bar in foos)
        {
            var myClass = new MyClass();
            myClass.DoStuff();
        }
    }
}

通常没有循环我只是用ParentClass构造函数注入它,但是在这里我需要为循环的每次迭代都有一个新的实例。

或许还有一种更好的办法来完成我想要实现的目标?也许myClass可以在每次迭代结束时重置自己,以便我可以重用它?

4 个答案:

答案 0 :(得分:7)

您可以将创建MyClass实例的工厂对象注入ParentClass。

对于每个循环迭代,您调用工厂对象,以便为您提供MyClass的新实例。

答案 1 :(得分:1)

您可以在构造函数中注入Func<IMyClass>,然后根据需要多次调用它来获取不同的实例。

像Autofac这样的IoC框架原生支持这个。

答案 2 :(得分:0)

这实际上取决于你想用MyClass做什么。就目前而言,foo,bar和MyClass之间没有相关性。假设您要将条形码注入MyClass的Ctor,或将其作为参数传递给DoStuff,那么我只需将一个工厂类或方法注入ParentClass Ctor并使用它来代替新建的MyClass。

答案 3 :(得分:0)

您提出的注射具有可读性,易于理解且易于验证的正确性。

如果循环很大或创建MyClass代价很高(例如,它打开连接,文件句柄,子进程或启动线程),则重置对象是一个选项。

由于reset()解决方案需要更多的时间和精力来验证每次代码更改,因此我建议在打扰之前实际测量这是一个瓶颈。