#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*(…)