w00*_*w00 14 .net c# design-patterns ioc-container inversion-of-control
我正在尝试理解像StructureMap这样的IoC框架的使用,但我不禁想到这些"设计模式"只是无意义,使代码变得更加复杂.
让我先从一个例子开始,我认为IoC有点用处.
我认为在处理MVC框架中控制器类的实例化时,IoC可能很有用.在这种情况下,我正在考虑.NET MVC框架.
通常,控制器类的实例化由框架处理.这意味着您无法将任何参数传递给控制器类的构造函数.这就是IoC框架可以派上用场的地方.在IoC容器中的某个位置,您可以指定constructor在调用控制器类时应该实例化哪个类并将其传递给控制器.
当您想要对控制器进行单元测试时,这也很方便,因为您可以模拟传递给它的对象.
但就像我说的,我可以理解为什么人们想将它用于控制器类.但不是在那之外.从那以后,您可以简单地执行正常的依赖注入.
但为什么不简单地这样做:
public class SomeController
{
public SomeController() : this( new SomeObj() )
{
}
publiv SomeController(SomeObj obj)
{
this.obj = obj;
}
}
Run Code Online (Sandbox Code Playgroud)
现在您不必使用任何第三方IoC框架,这也意味着更低的学习曲线.既然您不必深入了解该框架的规范.
您仍然可以在单元测试中模拟对象.所以也没问题.
你唯一能说的就是,"但现在你的类是紧密耦合到SomeObj".这是真的.但谁在乎!?这是一个控制器类!我永远不会重复使用那个类..那么为什么我要担心这种紧耦合......?我可以模拟传递给它的对象.这是唯一重要的事情.
那我为什么要打扰使用IoC呢?我真的错过了这一点......?对我来说,IoC模式只是一些被高估的模式.为您的应用添加更多复杂的图层......
你问了一个很好的问题,在你的例子中我会说IoC会/可能有点过分,但只要考虑你的代码扩展到以下,然后你就可以开始看到让IoC为你做这一切的好处.
public class SomeController
{
public SomeController() : this( new SomeObj(new configuration(), new SomethingElse(new SomethingElseToo())) )
{
}
publiv SomeController(SomeObj obj)
{
this.obj = obj;
}
}
Run Code Online (Sandbox Code Playgroud)