为什么要使用IoC框架

Raf*_*uez 6 ninject ioc-container

我一直在阅读关于控制框架的反转,我只是在玩这个问题:"为什么我到底需要一个框架才能做到这一点?"

不要误解我的问题......这种模式是我们程序员经常使用的东西,但是...这是一个全功能的框架吗?

我必须遗漏一些东西,这就是我发布问题的原因.我在网上看到了很多例子,我只是不明白.mi心灵可能被封锁了.

只需看看Ninject主页的示例:

public class Samurai {
    public IWeapon Weapon { get; private set; }
    public Samurai(IWeapon weapon) {
        Weapon = weapon;
    }
}

public class WarriorModule : NinjectModule {
    public override void Load() {
        Bind< IWeapon >.To< Sword >();
    }
}
Run Code Online (Sandbox Code Playgroud)

"Samurai"课对我来说没问题."NinjectModule"框架对我来说似乎没用.

我在代码中稍后假设我们将创建新的"Samurai"实例,并将"Sword"实例传递给它,例如:

Samurai theWarrior = new Samurai(WarriorModule.GetInstance(IWeapon));//no coupling
Run Code Online (Sandbox Code Playgroud)

可以替换为:

Samurai theWarrior = new Samurai(new Sword());//still no coupling
Run Code Online (Sandbox Code Playgroud)

要么

Samurai theWarrior = new Samurai(GetWeaponFromXML());//no coupling yet
Run Code Online (Sandbox Code Playgroud)

我错过了什么部分?您能否介绍一下我的应用程序中可能需要Ioc框架的一些场景?

谢谢.

4回答之后的更新:我真的很喜欢我们从你们那里得到的所有答案.我刚刚阅读了这篇帖子依赖注入 - 解剖/这个人用它进行单元测试和你刚才提供的StackOverflow链接,是的,我错过了那个重大的复杂部分,所以让我自己习惯使用IoC框架.再次感谢.

我会投票给你答案,但我只是得到一条橙色的信息说我做不到.

感谢那个突出显示我发布的代码的人.

dpu*_*ton 6

这是代码示例的问题.它们要么复杂而你没有解释你的观点,要么它们是微不足道的,然后看起来毫无意义.

WarriorModule正在做的是将具体类型绑定到接口,因此每当另一个类需要该接口的实现时,它就会由IoC容器自动接收.具有依赖性的类不依赖于具体类型,因此具有较低的耦合和较高的可测试性.我想你已经知道了.

在你的替换场景中,Samurai类没有耦合到剑类,但调用代码仍然是.您可以将其推出另一个级别,但该代码现在具有依赖性,您的干预类现在必须编组所有依赖项.

IoC容器为所有映射执行此操作,仅将其放在几个位置(模块类).你的其余代码是免费的,不关心,不依赖于具体的类型.

希望有所帮助.


Iai*_*ult 5

你的例子很简单,只有两层,但是当你有一个真实的例子时,它很快就会变得混乱:

var form = new OrderEntryForm(
    new OrderService(
        new OrderReposity(
            new DatabaseGateway(
                new DataProviderFactory()))))
Run Code Online (Sandbox Code Playgroud)

一个 IoC 容器可以为您完成所有接线工作,让您的生活更轻松。

这是来自类似问题的示例,其中包含所有细节:https : //stackoverflow.com/questions/45191/ioc-explain-and-more-important-when-to-use-it/45197#45197