0

所以我正在使用 Ninject,特别是上下文绑定如下:

Bind<IBlah>().ToMethod(x => FirstBlahProvider.Instance.GiveMeOne()).WhenTargetHas<FirstAttribute>().InRequestScope();
Bind<IBlah>().ToMethod(x => SecondBlahProvider.Instance.GiveMeOne()).WhenTargetHas<SecondAttribute>().InRequestScope();

我需要使用 Kernel 来获取给定的实例,并希望根据 Condition 来做WhenTargetHas<T>。像下面这样的东西会很棒。

var myblah = Kernal.Get<IBlah>(x => x.HasWithTarget<FirstAttribute>)

如何根据条件检索实例?

4

1 回答 1

0

得出答案:最好避免使用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 的 Attribute 并在构造函数参数中使用该属性。

作为 :

[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)

我需要解决作用域问题,但是当您拥有多个绑定时,这就是您同时满足构造函数注入和内核显式解析的方式。

于 2012-11-22T22:42:43.783 回答