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 を継承する属性を作成し、その属性をコンストラクターの引数で使用する必要があります。

として :

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

スコーピングを解決する必要がありますが、複数のバインディングがある場合に、コンストラクター インジェクションとカーネルからの明示的な解決の両方を満たす方法です。

于 2012-11-22T22:42:43.783 に答える