什么是依赖注入框架的重点?

nac*_*10f 8 asp.net-mvc dependency-injection

我确信我在这方面有点迷失...我的理解是依赖注入意味着初始化类所需的东西.例如.如果我的控制器需要一个服务,我希望能够测试它,那么我应该为它定义两个Constructor方法......所以,我的问题是......为什么人们使用Frameworks来实现这个?我迷路了

public class CompaniesController : Controller
    { 
        private ICompaniesService _service;

        public CompaniesController()
        {
            _service = new CompaniesService();
        }

        public CompaniesController(ICompaniesService service)
        {
            _service = service;
        }
Run Code Online (Sandbox Code Playgroud)

Mic*_*ins 6

一个主要原因是更好地支持单元测试和模拟对象以创建受控测试.

通过不在类中指定实现,您可以在运行时"注入"实现.(在您的示例中,ICompaniesService接口).

在运行时,使用诸如StructureMap,Unity或Castle Windsor之类的控制/依赖注入容器的反转,你可以说"嘿,任何时候有人想要ICompaniesService的实例给他们一个新的CompaniesService对象".

要对此类进行单元测试,您可以模拟我们的ICompaniesService并将其自己提供给构造函数.这允许您在模拟对象上设置受控方法.如果你不能这样做,那么对于CompaniesController的单元测试将仅限于使用公司服务的一个实现,这可能会影响实时数据库等,使你的单元测试既缓慢又不一致.

  • 依赖注入对单元测试的适用性是一个令人愉快的副作用.更"重要"的原因是支持松散耦合的应用程序. (4认同)

Jus*_*ner 5

人们不会使用依赖注入框架来生成您在示例中提供的代码。这仍然是开发人员的工作。

当有人调用构造函数时,将使用依赖注入框架。框架将注入 ICompaniesService 的具体实现,而不是开发人员显式调用构造函数。

虽然它是一个特定的产品,但nInject 主页实际上有一些非常好的示例。

  • http://wiki.github.com/ninject/ninject/dependency-injection-by-hand 我很确定我的代码是手动依赖注入的示例..所以框架提供了一种自动实现依赖注入的方法 (2认同)