IOC与新指南

use*_*375 3 inversion-of-control

最近我在寻找社区领导者在其开源实现中提供的一些源代码.其中一个项目利用了IOC.以下是示例假设代码:

public class Class1
{
    private ISomeInterface _someObject;

    public Class1(ISomeInterface someObject)
    {
        _someObject = someObject;
    }

    // some more code and then

    var someOtherObject = new SomeOtherObject();
}
Run Code Online (Sandbox Code Playgroud)

我的问题不是关于IOC是什么以及如何在技术术语中使用它们,而是关于对象创建的准则是什么.所有的努力,然后这一行使用"新"运算符.我不太明白.IOC应该创建哪个对象,哪个对象可以通过new运算符创建?

Jon*_*eet 6

作为一般经验法则,如果某些内容提供的服务可能需要替换以进行测试或使用不同的实现(例如,不同的身份验证服务),那么请注入依赖项.如果它类似于集合,或者是一个不提供您想要改变的行为的简单数据对象,那么可以在类中实例化它.


bev*_*qua 5

通常你使用IoC因为:

  • 可能在将来发生变化的依赖关系
  • 对接口进行编码,而不是具体类型
  • 在单元测试方案中启用模拟这些依赖项

你可以避免IoC在你不控制依赖关系的情况下使用,例如a StringBuilder总是一个StringBuilder并且有一个已定义的行为,你通常不需要模拟它; 虽然你可能想要模拟一个HttpRequestBase,因为它是一个外部依赖于互联网连接,例如,这是单元测试中的一个问题(更长的执行时间,并且它是你无法控制的).

数据库访问存储库等也会发生同样的情况.