2013-03-18 97 views
14

我试图理解像StructureMap这样的IoC框架的使用,但我不禁认为这些“设计模式”只是无稽之谈,使代码变得更加复杂。MVC应用程序中IoC框架的用途是什么?

让我从一个例子开始,我认为IoC有点有用。

我认为在处理MVC框架中控制器类的实例时,IoC可能是有用的。在这种情况下,我正在考虑.NET MVC框架。

通常,控制器类的实例化由框架处理。所以这意味着你不能将任何参数传递给控制器​​类的构造函数。 这是IoC框架可以派上用场的地方。在IoC容器的某个地方,您可以指定应该实例化哪个类,并在调用控制器类时将其传递给控制器​​constructor

当你想单元测试控制器时,这也很方便,因为你可以模拟传递给它的对象。

但就像我说的,我可以理解为什么人们想要将它用于他们的控制器类。但除此之外。从那里你可以简单地做正常依赖注入

但是,为什么不干脆像这样做:

public class SomeController 
{ 
    public SomeController() : this(new SomeObj()) 
    { 
    } 

    publiv SomeController(SomeObj obj) 
    { 
     this.obj = obj; 
    } 
} 

现在你不必使用任何第三方IoC框架这也意味着较低的学习曲线。因为你不必进入该框架的规格。

您仍然可以在单元测试中模拟对象。所以在那里也没有问题。

你唯一可以说的是,“但是现在你的班级是紧密耦合SomeObj”。 这是真的。但谁在乎!?这是一个控制器类!我永远不会重复使用这个类。那么为什么我要担心这种紧密的耦合......?我可以嘲笑传递给它的对象。这是唯一重要的事情。

那么,为什么我应该打扰使用IoC?我真的错过了点...?对我来说,IoC模式只是一些被高估的模式。将更多,更复杂的图层添加到您的应用程序中...

+0

@HenkHolterman不一定当有人来与一个很好的论点,为什么我的做法是错误的,在什么样的情况。我不打算与任何人争论。只是在这个问题上寻找建议。 – w00 2013-03-18 16:06:05

+3

[为什么需要IoC容器而不是简单的DI代码?](http://stackoverflow.com/questions/871405/why-do-i-need-an-ioc-container-as-opposed -to-直截了当二 - 代码) – 2013-03-18 16:07:21

回答

8

你问一个很好的问题,在你的榜样,我会说一个IoC会/可能是矫枉过正,但只要将您的代码扩展到以下范围,然后您就可以开始看到让IoC为您完成这些工作的好处。

public class SomeController 
{ 
    public SomeController() : this(new SomeObj(new configuration(), new SomethingElse(new SomethingElseToo()))) 
    { 
    } 

    publiv SomeController(SomeObj obj) 
    { 
     this.obj = obj; 
    } 
} 
4

IoC容器可以为您执行多种操作。

显而易见的是为依赖关系提供实现,这在其他地方是有意义的,而不仅仅是在控制器中 - 如果您决定用SomeObj2替换SomeObj,则只能在一个地方而不是57个地方执行。

另一个是处理生命周期问题,即可以指定对象的范围(单例,每线程,每请求,瞬变...)。

此外,IoC容器可以设置您的可选依赖关系(即,物业注射),这比写这个简单:

var svc = new Service(new MyRepository()) 
svc.Logger = logger; 
svc.XY = xy 

,所有这里所述的理由:Why do I need an IoC container as opposed to straightforward DI code?

2

但谁在乎!?这是一个控制器类!我不打算重用 类,永远..

这是一个很好的点,而是考虑如何清洁器的代码,如果你有嵌套的相关,不同的生命周期。例如,您可以拥有一些应用程序级别的单例,这需要“按请求”等等。 IoC使您的代码更清晰,并且易于修改。

相关问题