Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环中的依赖项注入_C#_Dependency Injection - Fatal编程技术网

C# 循环中的依赖项注入

C# 循环中的依赖项注入,c#,dependency-injection,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

public class ParentClass
{
    public void MyFunction(IList<Foo> foos)
    {
        foreach (var bar in foos)
        {
            var myClass = new MyClass();
            myClass.DoStuff();
        }
    }
}
公共类父类
{
公共void MyFunction(IList foos)
{
foreach(foos中的变量栏)
{
var myClass=新的myClass();
myClass.DoStuff();
}
}
}
通常情况下,如果没有循环,我只会将它与父类构造函数一起注入,但在这里,我需要为循环的每次迭代都提供一个新的实例


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

您可以在构造函数中插入一个
Func
,然后根据需要多次调用它以获得不同的实例


像Autofac这样的IoC框架本机支持这一点。

您可以将创建MyClass实例的factory对象注入父类


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

这实际上取决于您希望对MyClass执行什么操作。目前,foo's、bar's和MyClass之间没有相关性。假设您将bar注入MyClass的Ctor中,或者将其作为参数传递给DoStuff,那么我只需将工厂类或方法注入父类Ctor中,并使用它来代替新建MyClass。

您建议的注入是可读的、可理解的,并且易于验证其正确性

如果循环较大,或者创建
MyClass
成本较高(例如打开连接、文件句柄、子进程或启动线程),则可以选择重置对象


由于
reset()
解决方案在每次代码更改时都需要花费更多的时间和精力来验证,因此我建议在麻烦之前先测量一下这是否是一个瓶颈。

那么为什么不定义一个对象集合,或者在创建新实例时将DoStuff定义为静态,并立即丢弃它们呢。然而,我建议在需要之前不要使用任何IoC容器:DTSTTCPW(最简单的认为可能有效)@Skyp'Simplest'是一个模糊的概念,没有目标。如果单元测试是一个目标,那么使用IoC是可能工作的最简单的事情之一?在这种情况下,我们必须将容器本身注入工厂。我在这里看到两个警告——注入容器和使用container.Resolve(服务定位器)。这是推荐的吗?还有其他方法吗?这是个好问题,@hungryMind,我认为你应该把它作为一个真正的问题推广到SO中,并将它与这个问题联系起来。无论如何,我发现这篇文章提供了一些选项: