Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Design patterns 在方法代码中直接调用DI容器(MVC操作)_Design Patterns_Dependency Injection_Ioc Container - Fatal编程技术网

Design patterns 在方法代码中直接调用DI容器(MVC操作)

Design patterns 在方法代码中直接调用DI容器(MVC操作),design-patterns,dependency-injection,ioc-container,Design Patterns,Dependency Injection,Ioc Container,我在玩DI(使用Unity)。我已经学会了如何进行构造函数和属性注入。我通过Global.asax文件(mvcapapplication类)中的属性公开了一个静态容器 我的控制器中需要许多不同的对象。通过构造函数注入它们似乎是不对的,部分原因是它们的数量太多,部分原因是它们只在某些操作方法中需要 问题是,直接从Action方法中调用我的容器有什么不对吗 public ActionResult Foo() { IBar bar = (Bar)MvcApplication.Container

我在玩DI(使用Unity)。我已经学会了如何进行构造函数和属性注入。我通过Global.asax文件(mvcapapplication类)中的属性公开了一个静态容器

我的控制器中需要许多不同的对象。通过构造函数注入它们似乎是不对的,部分原因是它们的数量太多,部分原因是它们只在某些操作方法中需要

问题是,直接从Action方法中调用我的容器有什么不对吗

public ActionResult Foo()
{
    IBar bar = (Bar)MvcApplication.Container.Resolve(IBar);
    // ... Bar uses a default constructor, I'm not actually doing any
    // injection here, I'm just telling my conatiner to give me Bar
    // when I ask for IBar so I can hide the existence of the concrete
    // Bar from my Controller.
}
这似乎是最简单、最有效的做事方式,但我从未见过这样的例子

这有什么问题吗?我是否在某种程度上遗漏了这个概念?

是的,使用静态服务定位器有问题,因为


构造函数注入是您的最佳选择。如果构造函数变得太大,则表明控制器违反了,您应该遵守。

谢谢标记,这些都是非常好的博客文章。也许我的控制器违反SRP是对的。这似乎是一个容易陷入MVC的陷阱。。。所有与订单有关的事情都应该进入OrdersController,对吗?嗯,我想也许不是。但是,您如何知道您在定义责任时有足够的粒度?我的控制器的职责是在响应和视图之间转发数据。我想你可以说这是一个单一的责任。但它仍然需要半打辅助对象,这取决于视图的哪一部分正在发生变化。控制器经常发生这种情况,这并不一定有什么问题。我的观点是,我们通常可以将这些原子依赖聚合成一些高阶抽象。这给了我们更多的层,但每一层都变得不那么复杂。