【问题标题】:I'm confused about interface abstractions when using IoC使用 IoC 时我对接口抽象感到困惑
【发布时间】:2011-07-05 21:39:40
【问题描述】:

我最近一直在尝试学习 IoC,根据以下代码有几个问题:

public class WarriorModule : NinjectModule 
{
    public override void Load() 
    {
        Bind<IWeapon>().To<Sword>();
        Bind<Samurai>().ToSelf();
    }
}

我无法理解新的接口概念。之前我会创建一个接口比如IRunnable,实现函数void Run()。对于 IoC,我现在将接口视为仅映射到单个具体类的东西。假设,我如何将多个具体类映射到一个接口?我一直在阅读,您可以将多个接口映射到一个具体类,但不能反过来(除非这是上下文映射的来源入戏)。

假设接口只映射到单个对象,我应该什么时候创建一个接口而不是让一个对象绑定到自身?无论哪种方式,当映射时您都必须更改同一段代码更改正确吗?


编辑:我标记了我所做的答案,因为它对我个人有帮助。不过,这两个 cmets 都提供同样丰富的信息。

【问题讨论】:

    标签: dependency-injection ioc-container ninject


    【解决方案1】:

    我最近addressed this topic from a more general viewpoint。底线是松散耦合的代码倾向于产生过多的 1:1 接口。这与Reused Abstractions Principle相反。

    然而,这更像是一个应用程序设计问题,而不是与特定 DI 容器有关的问题。虽然我不知道 Ninject,但我使用过的所有其他容器(Castle Windsor、StructureMap、Spring.NET、Autofac、Unity 甚至 MEF)都可以将多个实现映射到同一个接口。他们如何做到这一点略有不同,但我在my book 的第四部分涵盖了所有这些 - 不幸的是,书中没有介绍 Ninject。

    【讨论】:

    • 这帮助我回到正轨:“松散耦合的代码倾向于产生过多的 1:1 接口”。谢谢你-我觉得这些概念在三天后终于深入人心-.-
    【解决方案2】:

    一个好的 IoC 容器不应该改变接口的使用方式:

    1. 应该为将其用作依赖项的组件而不是实现它的类设计接口。 (接口隔离原则)
    2. 一个类可以实现多个接口。但只有当这些接口用于相同类型的服务时才应该这样做,以便类只做一件事。如果接口用于两种不同的事物,则它们应该由两个不同的类实现。 (单一责任原则)
    3. 如果您需要针对此类服务使用多种策略,则可以使用多个类实现同一个接口。

    Ninject 允许使用两种不同的概念以这种方式使用接口:

    1. 条件绑定:如果多个类实现相同的接口,您必须指定在哪种情况下使用哪个实现。这是使用条件完成的:

      Bind&lt;IWeapon&gt;().To&lt;Sword&gt;().When(ctx =&gt; TodayIsSunday());

      Bind&lt;IWeapon&gt;().To&lt;Dagger&gt;().When(ctx =&gt; !TodayIsSunday());

    2. 多接口:见我的博文http://www.planetgeek.ch/2010/12/08/ninject-extension-contextpreservation-explained/

    【讨论】:

    • +1 虽然我无法评论 Ninject 的细节,但我完全同意这里提出的一般观点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2012-07-18
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多