Ninject Get<T> WhenTargetHas<T>
Поэтому я использую Ninject, а именно контекстную привязку следующим образом:
Bind<IBlah>().ToMethod(x => FirstBlahProvider.Instance.GiveMeOne()).WhenTargetHas<FirstAttribute>().InRequestScope();
Bind<IBlah>().ToMethod(x => SecondBlahProvider.Instance.GiveMeOne()).WhenTargetHas<SecondAttribute>().InRequestScope();
Мне нужно использовать ядро, чтобы получить данный экземпляр, и я хотел бы сделать это на основе условия WhenTargetHas<T>
, Что-то вроде следующего было бы здорово.
var myblah = Kernal.Get<IBlah>(x => x.HasWithTarget<FirstAttribute>)
Как вы можете получить экземпляр на основе условия?
1 ответ
Выработал ответ: Лучше всего избегать использования WhenTargetHas<T>
вместо этого используйте WithMetaData(key, value)
Так
Bind<IBlah>().ToMethod(x => FirstBlahProvider.Instance.GiveMeOne()).WhenTargetHas<FirstAttribute>().InRequestScope();
Bind<IBlah>().ToMethod(x => SecondBlahProvider.Instance.GiveMeOne()).WhenTargetHas<SecondAttribute>().InRequestScope();
Становится:
Bind<IBlah>().ToMethod(x => FirstBlahProvider.Instance.GiveMeOne()).WithMetaData("Provider", "First);
Bind<IBlah>().ToMethod(x => SecondBlahProvider.Instance.GiveMeOne()).WithMetaData("Provider", "Second");
Затем вам нужно создать Атрибут, который наследует Ninject ConstraintAttribute и использовать этот атрибут в аргументе вашего конструктора.
Как:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = true, Inherited = true)]
public class FirstProviderConstraint : ConstraintAttribute
{
public override bool Matches(IBindingMetadata metadata)
{
return metadata.Has("Provider") && metadata.Get<string>("Provider") == "First";
}
}
Затем вы используете его в конструкторе arg как:
public class Consumer([FirstProviderConstraint] IBlah)
{
...
}
Или разрешение из ядра
Get<ISession>(metaData => metaData.Get<string>(BindingKeys.Database) == BindingValues.OperationsDatabase)
Мне нужно разрешить область видимости, но таким образом вы удовлетворяете как инжекцию Конструктора, так и явное разрешение из Ядра, когда у вас есть более одной привязки.