【问题标题】:Other than testing, how is Dependency Injection any better than static classes/methods?除了测试之外,依赖注入如何比静态类/方法更好?
【发布时间】:2009-09-27 04:50:15
【问题描述】:

除了可测试性之外,利用 D.I. 的最大优势是什么? (而且我不是在谈论静态类的 D.I. 框架或 IoC)?特别是对于您知道服务不会被换出的应用程序。

在我们的一个 c# 应用程序中,我们的团队在 Web Web GUI、服务层和存储库层中使用依赖注入,而不是使用静态方法。过去,我们有由静态类创建、修改、传递和保存的 POCO(业务实体对象)。

例如,过去我们可能写过:

CreditEntity creditObj = CreditEntityManager.GetCredit(customerId);
Decimal creditScore = CreditEntityManager.CalculateScore(creditObj);
return creditScore;

现在,使用 D.I.,相同的代码将是:

//not shown, _creditService instantiation/injection in c-tors
CreditEntity creditObj = _creditService.GetCredit(customerId);
Decimal creditScore = _creditService.CalculateScore(creditObj);
return creditScore;

没有太大不同,但现在我们有几十个范围更广的服务类,这意味着我们应该将它们视为静态的(即没有私有成员变量,除非它们用于定义更多依赖项)。另外,如果这些方法中的任何一个使用资源(数据库/Web 服务/等),我们会发现管理并发问题会更加困难,除非我们移除依赖关系并使用旧的静态或 using(...) 方法。

【问题讨论】:

  • “除了可测试性,使用 D.I. 的最大优势是什么”就像对我说“除了头顶上的屋顶,还有什么大的优势”。

标签: c# architecture static dependency-injection


【解决方案1】:

D.I. 的问题可能是:CreditEntityManager 实际上是集中有关如何找到CreditEntity 以及去哪里CalculateScore 的知识的自然场所吗?

我认为 D.I. 的理论。是一个涉及到事物 X 的模块化应用程序不一定知道如何与事物 Y 挂钩,即使 X 需要 Y .

在您的示例中,您展示了在服务提供者被定位并合并到数据对象中之后的代码流。在那一点上,当然,无论有没有 D.I.它看起来大致相同,甚至可能完全相同,具体取决于编程语言、风格等。

关键是如何将这些不同的服务连接在一起。在 D.I. 中,潜在的第三方对象本质上是进行配置管理,但完成后代码应该大致相同。 D.I. 的重点不是为了改进以后的代码,而是尝试将问题的模块化性质与程序的模块化性质相匹配,以避免不得不编辑逻辑上正确的模块和程序逻辑,但连接到错误的服务供应商。

【讨论】:

  • 所以对于没有特别封装的内部服务/组件(即我们永远不会将它们换掉),D.I.没有提供很多好处?
  • 您可能仍希望插入模拟对象和服务以进行单元测试。如果你已经有一个测试框架并且你永远不会重新配置服务连接,或者你已经有一个可接受的插件架构,那么可以肯定的是,没有 D.I. 你会赢,尽管任何类型的插件或测试框架都可能看起来有点像 D.I.设计模式。
【解决方案2】:

它允许您在不破解代码的情况下更换实现。例如,在我的一个应用程序中,我们创建了一个名为 IDataService 的接口,它定义了用于查询数据源的方法。对于前几个生产版本,我们使用了一个使用 nHibernate 的 Oracle 实现。后来,我们想切换到一个对象数据库,所以我们为 db4o 编写和实现,将它的程序集添加到执行目录并在配置文件中更改了一行。快!我们使用 db4o 无需破解代码。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 但是如果服务是瞬态的,为什么要实例化一个对象呢?静态类在逻辑上不是更好地表示无状态对象吗?
    • 使用 DI 容器时,您只需编写服务代码,然后为每个服务配置适当的生活方式(这也可以是每个 Web 请求、每个线程或任何东西)。服务必须是可实例化的。如果您有疑问,请提出其他问题。
    【解决方案4】:

    有一个Guice video 提供了一个很好的使用 D.I. 的示例案例。如果您使用大量需要动态连接的 3-rd 方服务,D.I 将是一个很大的帮助。

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多