Контекстные привязки с Ninject 2.0

#parameters #ninject #ninject-2 #conditional-binding #contextual-binding

#параметры #ninject #ninject-2 #условная привязка #контекстная привязка

Вопрос:

В 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?

Комментарии:

1. Я скоро посмотрю, но вам действительно следует использовать список рассылки для этого материала.

2. Спасибо, что указали на это. Я не знал о списке рассылки. Я перепечатал этот вопрос там.

3. @Ian Davis: Я действительно предпочитаю SO спискам рассылки. Если 101 вопрос можно разместить здесь в виде переупорядочиваемых, редактируемых и комментируемых ответов, а не похороненных в сугробе электронных писем, это просто лучше. Но это только для меня, я думаю.

4. Списки рассылки хороши для коммиттеров и преданных, но если вам нужно сообщество потребителей, вы добавляете его в документы, а затем каждое отдельное утверждение одного и того же 101 вопроса может быть объединено там (здесь). Если коммиттеры затем захотят собрать информацию, содержащуюся в пользовательских вопросах, она будет готова в гораздо более сжатом формате, и они не будут завалены бесконечными потоками новичков, задающих одни и те же вопросы.

5. В списке рассылки сотни людей, непосредственно заинтересованных в создании темы, которая быстрее решается. Мне нравится SO для многих вещей, но не для проектов OS со следующими.

Ответ №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) amp;amp; metadata.Get<bool>(metaDataKey));
    Assert.IsType<Shuriken>( weapon );

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

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

Комментарии:

1. Что делать, когда вам действительно нужно, чтобы предикат находился в модуле, а не на сайте Get call?

2. Вы можете использовать методы kernel.Bind<IWeapon>().To<Sword>().When*(…)