IOC与新指南

时间:2012-03-20 16:45:41

标签: 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();
}

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

2 个答案:

答案 0 :(得分:6)

作为一般的经验法则,如果有什么东西提供服务,可能想要替换它们进行测试或使用不同的实现(例如不同的身份验证服务),那么注入依赖项。如果它就像一个集合,或者一个简单的数据对象,它没有提供你想要改变的行为,那么可以在类中实例化它。

答案 1 :(得分:5)

通常您使用IoC,因为:

  • 将来可能会改变的依赖
  • 针对接口编码,而不是具体类型
  • 在单元测试方案中启用模拟这些依赖项

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

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