Контекстные привязки с Ninject 2.0
В 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 ответ
Решение
Вы можете использовать метаданные,
[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);
}