dependency-injection - 使用 IoC 时我对接口(interface)抽象感到困惑

标签 dependency-injection ioc-container ninject

我最近一直在尝试学习 IoC,并且基于以下代码有几个问题:

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

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

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

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

最佳答案

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

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

  • Ninject 允许使用两种不同的概念以这种方式使用接口(interface):
  • 条件绑定(bind):如果多个类实现相同的接口(interface),则必须指定在哪种情况下使用哪个实现。这是使用条件完成的:
    Bind<IWeapon>().To<Sword>().When(ctx => TodayIsSunday());Bind<IWeapon>().To<Dagger>().When(ctx => !TodayIsSunday());
  • 多种接口(interface):见我的博文 http://www.planetgeek.ch/2010/12/08/ninject-extension-contextpreservation-explained/
  • 关于dependency-injection - 使用 IoC 时我对接口(interface)抽象感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5144622/

    相关文章:

    c# - 不了解在系统架构中的何处创建 IoC 容器

    asp.net-mvc - 没有为此对象定义无参数构造函数。注入(inject) + MVC 5

    .net - 使用 Autofac 在 .NET Framework 中注册 IHttpClientFactory DI

    c# - 在 DI 环境中使用时出现奇怪且难以调试的错误

    singleton - IOC "child"容器/服务定位器

    caSTLe-windsor - 无法实例化 Windsor 自定义组件激活器

    c# - 使用 Ninject 过滤构造函数注入(inject)

    c# - 如何在运行时使用 Ninject 的 DI 动态添加新绑定(bind)?

    c# - ASP.NET 核心 DI : Resolve same instance if scoped service is registered both as service type and implementation type

    c# - 如何从类中访问 ASP.NET Core DI 容器