可以有人向我解释的优点使用IOC容器的过度简单的硬编码默认的行为的默认构造?

换句话说,什么是错误的关于这个代码?

public class MyClass
{
    private IMyInterface _myInterface;

    public MyClass()
    {
        _myInterface = new DefaultMyInterface();
    }

    public MyClass(IMyInterface myInterface)
    {
        _myInterface = myInterface;
    }
}

我可以告诉,这类支持的构造注入足以使单元的测试和模拟是很容易做到。除此之外,默认构造中删除计算的开销的,国际奥委会的容器(更不要说的整个过程是一个很大的透明)。

唯一的好处是我可以看到用一个IOC容器是如果您需要交换了执行你的接口频繁。我失去了一些东西?

有帮助吗?

解决方案

这个想法的IoC被委派的部分组件的功能以另一系统的一部分。在IoC世界,您有分量,不知道有关各方。你的例违反了这一点,因为你正在创建之间的紧耦合MyClass和一些执行IMyInterface. 主要的想法 这是你的分量 没有知识 关于它怎么会被使用。在你的例子,你的分量 使得一些假设 关于其使用。

实际上这种方法可以工作,但是混合海洋学委员会和明确对象的初始化不是一个好的做法,海事组织。

IoC给你的松散耦合的执行后期具有约束力的价码的清晰度。当你增加额外的行为这一进程,它使事情更加复杂,并可能导致错误时,一些部件可能可以接收对象不必要或不可预知的行为。

其他提示

选择一个侧面:)

在短IOC建议。该问题的代码,我不能换出默认的执行情况的依赖,而无需重新编译代码正如你们所指出的末尾。IOC可以让你改变的结构或组合的对象在一个外部文件中没有重新编译。
IOC的"建筑和组装"的责任,从其余的代码。 目的IOC是不要让你的代码进行测试...这是一个令人愉快的副作用。(只是喜欢TDDed码导致更好的设计)

有什么不对用这个代码和你仍然可以使用它与依赖注射框架喜欢春题之一,因.

许多开发商看到春天的XML配置文件作为一个优势,线路的依赖关系内的代码作为可以切换实现,而不需要一个汇编的步骤。这种利益实际上是实现在情况已经有几个实现中编类中的路径和你想要选择执行在部署时间。你可以想象一下,一个情况下,一个组件是由第三方提供后部署。同样有可能的情况下,当你想要的船舶的额外的实现作为修补后的部署。

但并不是所有的DI框架使用XML配置。谷歌题之一,因为如有模块的编写为Java类,必须编像任何其他java类。

所以什么优势迪如果你还需要汇编的步骤?这把我们带回到你原来的问题。我可以看到以下优点:

  1. 标准的做法迪的整个应用程序。
  2. 结构整齐分离出来是从其他的逻辑。
  3. 能力注入代理。弹簧例如可以让你做的声明的交易处理通过注入代理人代替你实现
  4. 更容易重新使用的结构的逻辑。当你使用DI广泛,你会看到一个复杂的树依赖性不断变化的时间。管理它没有清楚地分离出来配置层和框架的支持可以是一个噩梦。迪框架,使其易于重新使用的结构逻辑,通过继承和其他装置。

唯一的问题我们是(1)如果你默认服务的依赖本身具有的另一/二级服务的依赖(等等...你DefaultMyInterface取决于ILogger)和(2)你需要隔离的第一次服务的依赖从第二(需要测试DefaultMyInterface与根ILogger).在这种情况下,显然将需要失去的默认"的新的DefaultMyInterface"和而不是做一个:(1)纯粹依赖注射或(2)服务定位器或(3)容器。积累(新DefaultMyInterface());

一些关注其他的海报,列出可能不公平的问题。你不要求有关的多个"生产"的实现。你是问 单元的测试。 在这种情况下的单元测试你的方法,与我第一个告诫说,似乎是合法的;我也要考虑使用简单的单元的测试案例。

同样,有几个应答者表示关切repititiousness.我不喜欢repitition,但是,如果(1)默认的执行情况真的是你默认(YAGNI:你没有计划改变的默认)和(2)你不相信该首先警告我说适用和(3)更喜欢较简单的代码的方法共享,然后我不认为这种特殊形式的repitition是一个问题。

除了松散耦合,IoC将减少代码重复。当您用一个国际奥委会和你想改变的默认实现接口,你必须去改变它在只有一个地方。当你使用默认contructors注入默认的执行情况,你必须去改变它无处不在的界面使用。

除了其他评论,人们可以争辩的干(不要重复自己)的原则在这些情况。这是redudnant到必须把默认修建代码中的每一类。它也introducign特殊情况下处理那里不需要任何。

我不明白为什么你的技术的硬编码默认的执行情况不能一起使用的一个IOC容器。只是依赖关系,你不指定的配置将采取默认的执行情况。

或者我是不是错过什么?

一个原因,你可能希望使用海委容器将促进晚配置的软件。

举例说,你提供的数实现的特定接口的客户(或专业服务小组)可以决定使用哪一种通过修改国际奥委会的配置文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top