【问题标题】:Contextual bindings with Ninject 2.0Ninject 2.0 的上下文绑定
【发布时间】:2010-03-24 13:14:06
【问题描述】:

在 Ninject 1.0 中,我有以下绑定定义:

Bind<ITarget>().To<Target1>().Only(When.Context.Variable("variable").EqualTo(true));
Bind<ITarget>().To<Target2>();

鉴于我有这样的绑定:

ITarget target = kernel.Get<ITarget>(With.Parameters.ContextVariable("variable", true));
ITarget target = kernel.Get<ITarget>(With.Parameters.ContextVariable("variable", false));

第一次调用被解析为 Target1 的实例,第二次调用被解析为 Target2 的实例。

如何将其翻译成 Ninject 2.0?

【问题讨论】:

  • 我很快就会看看,但你真的应该使用邮件列表来处理这些东西。
  • 感谢您指出这一点。我不知道邮件列表。我在那里转发了这个问题。
  • @Ian Davis:我真的更喜欢 SO 而不是邮件列表。如果这 101 个问题可以作为可重新排序、可编辑、可评论的答案出现在这里,而不是埋在雪堆里的电子邮件中,那就更好了。但这只是我猜的。
  • 邮件列表对提交者和奉献者来说很好,但如果你想要一个消费者社区,你可以用文档播种,然后可以在那里(这里)合并同一个 101 问题的每个不同陈述。如果提交者想要收集用户问题中包含的喋喋不休,它会以更简洁的格式准备就绪,而且他们还没有被无休止的新手洪流所淹没。
  • 邮件列表有数百人直接对主题感兴趣,从而更快地解决。我喜欢 SO 做很多事情,但不喜欢有以下项目的 OS 项目。

标签: parameters ninject ninject-2 conditional-binding contextual-binding


【解决方案1】:

您可以使用元数据,

[Fact]
public void MetadataBindingExample()
{
    string metaDataKey = "key";
    kernel.Bind<IWeapon>().To<Shuriken>().WithMetadata(metaDataKey, true);
    kernel.Bind<IWeapon>().To<Sword>().WithMetadata(metaDataKey, false);
    kernel.Bind<IWeapon>().To<Knife>();

    var weapon = kernel.Get<IWeapon>(metadata => metadata.Has(metaDataKey) && metadata.Get<bool>(metaDataKey));
    Assert.IsType<Shuriken>( weapon );

    weapon = kernel.Get<IWeapon>(metadata => metadata.Has(metaDataKey) && !metadata.Get<bool>(metaDataKey));
    Assert.IsType<Sword>(weapon);

    weapon = kernel.Get<IWeapon>(metadata => !metadata.Has(metaDataKey));
    Assert.IsType<Knife>(weapon);
}

【讨论】:

  • 当你真的需要谓词在模块中而不是在 Get 调用站点时怎么办?
  • 可以使用 kernel.Bind().To().When*(...) 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
相关资源
最近更新 更多