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)

Мне нужно разрешить область видимости, но таким образом вы удовлетворяете как инжекцию Конструктора, так и явное разрешение из Ядра, когда у вас есть более одной привязки.

Другие вопросы по тегам