使用IoC时,我对界面抽象感到困惑

时间:2011-02-28 16:25:32

标签: dependency-injection ioc-container ninject

我最近一直在努力学习IoC,并根据以下代码提出几个问题:

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

我无法掌握接口的新概念。在创建IRunnable之类的接口之前,实现函数void Run()。在IoC中,我现在将界面视为仅映射到单个具体类的东西。假设,如何将多个具体类映射到接口?我一直在阅读您可以将多个接口映射到单个具体类,但不是相反(除非这是上下文映射到来的地方)发挥)。

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


编辑:我标记了我做的答案,因为它帮助了我个人。这两条评论都具有同样的信息。

2 个答案:

答案 0 :(得分:18)

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

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

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

      Bind<IWeapon>().To<Sword>().When(ctx => TodayIsSunday());

      Bind<IWeapon>().To<Dagger>().When(ctx => !TodayIsSunday());

    2. 多个界面:请参阅我的博文http://www.planetgeek.ch/2010/12/08/ninject-extension-contextpreservation-explained/

答案 1 :(得分:16)

我最近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。