答えを導き出しました: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";
}
}
次に、コンストラクター引数で次のように使用します。
public class Consumer([FirstProviderConstraint] IBlah)
{
...
}
またはカーネルから解決する
Get<ISession>(metaData => metaData.Get<string>(BindingKeys.Database) == BindingValues.OperationsDatabase)
スコーピングを解決する必要がありますが、複数のバインディングがある場合に、コンストラクター インジェクションとカーネルからの明示的な解決の両方を満たす方法です。