2012-03-15 167 views
6

什么是做下面让ParentClass不依赖于MyClass正确的方法是什么?依赖注入的循环

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

通常没有一个循环我刚刚与父类的构造函数注入它,但在这里我需要的是一个新的实例为循环的每个迭代。

或许还有干脆更好的办法做我想要达到什么目的?也许myClass可以在每次迭代结束时自行重置,以便我可以重用它?

+0

那么,为什么不定义对象的集合,或者只是定义DoStuff为静态在创建新实例,并扔掉立刻 – 2012-03-15 16:46:25

回答

7

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

对于每个循环迭代,你叫工厂对象,因此它给你的MyClass一个新的实例。

+1

当对象具有进一步的依赖性时,如何在工厂内创建对象?在这种情况下,我们必须将容器本身注入工厂。我在这里看到两个警告 - 注入容器并使用container.Resolve(服务定位器)。这是建议吗?任何其他方法? – hungryMind 2016-04-29 09:21:04

+0

这是一个很好的问题,@hungryMind,我认为你应该把它作为一个真正的问题提升到SO,并将其与这个问题联系起来。无论如何,我发现这篇文章提供了一些选择:http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/ – Fabio 2016-04-29 17:03:25

1

您可以在构造函数中注入Func<IMyClass>,然后调用它多次,你想要得到不同的实例。

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

+0

我跟你aggree。但是,我会建议不要使用任何IoC容器,直到它成为必需:DTSTTCPW(做最简单的想法,可能可行) – Skyp 2012-03-15 16:48:56

+0

@Skyp'最简单'是一个没有目标或目标的模糊概念。如果单元测试是一个目标,那么使用IoC是最简单的工作之一。 – 2012-03-15 17:34:51

0

这真的取决于你想用MyClass做什么。就目前而言,foo,酒吧和MyClass之间没有关联。假设你要么将Bar注入到MyClass的Ctor中,要么将它作为参数传递给DoStuff,那么我只需将一个工厂类或方法注入到ParentClass Ctor中,并用它来代替新建的MyClass。

0

你提出的注入是可读的,可以理解的,容易验证其正确性。

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

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