3

渡されたパラメータに基づいて、ninjectで条件付きバインディングを使用したいと思います。私は以下のようなものを持っています:

public class Subject
{
}

public interface ITarget
{
}

public class Target1 : ITarget
{
}

public class Target2 : ITarget
{
}

そして今、私はITargetインターフェースをインスタンス化する必要があります:

    public void MethodName(IKernel kernel)
    {
        ITarget target1 = kernel.Get<ITarget>(new Parameter("name", new Subject(), true)); // Should be instance of Target1
        ITarget target2 = kernel.Get<ITarget>(); // Should be instance of Target2
    }

適切なバインディングを定義するのに問題があります。私は次のことを試しました:

kernel.Bind<ITarget>().To<Target1>().When(Predicate);
kernel.Bind<ITarget>().To<Target2>();

private bool Predicate(IRequest request)
{
    IParameter parameter = request.Parameters.Count == 0 ? null : request.Parameters[0];
    if (parameter == null)
    {
        return false;
    }
    object parameterValue = parameter.GetValue( /*what to put here?*/);
    return parameterValue != null && parameterValue.GetType().IsAssignableFrom(typeof(Subject));
}

しかし、渡されたパラメータの値を取得する方法がわかりません。IContextインスタンスをGetValueメソッドに渡す必要がありますが、IContextの有効なインスタンスを取得する方法がわかりません。それとも、私のタスクを達成するためのより良い方法がありますか?

編集:BindingMetadataは私の問題を解決するためのより良い方法です。詳細については、Ninject2.0を使用したコンテキストバインディングを参照してください。

よろしく

4

2 に答える 2

2

IRequest.ParentContextあなたに十分ではありませんか?

また、探しているのが名前を使用して複数のインスタンスを明確にすることだけである場合[そして、毎回それを提供する立場にあり、IDeityが意図したようにDIを使用する代わりに、その明示的なサービスロケーションの方法で作業することができます] 、次に、バインド側に名前とWithNameのGetオーバーロードがあります。

編集:Reflectorでしばらく過ごしましたが、それでもそれほど賢くはありません。パラメータメカニズムは、適用されるバインディングの選択の一部としてではなく、実際に発生しているバインディングのコンテキストで特定の値をオーバーライドすることを目的としているようです。コンテキストの確立は内部で1か所でのみ行われるContextため(パブリックctorはありますが)、そのための適切なファクトリがあるようには見えません。

実際のシナリオは、たまたま制約メカニズムに適合していますか(名前を使用してフィルタリングするのが最も単純なケースです)。つまり、次のように表現できますGetか。

_kernel.Get<ITarget>( (Ninject.Planning.Bindings.BindingMetadata metadata)=>metadata.Has("x") );

うまくいけば、私も答えを知りたいので、@ Ian Davisがすぐに来るでしょう:D

于 2010-03-18T14:31:01.343 に答える
1

IIRCリクエストは、いくつかのコンテキストの一部にすることができます。表示されるパラメーターは、Get呼び出しで指定するパラメーターのみです。与えた例では、サブジェクトインスタンスを取得するために、IContextとしてnullを渡すことができるはずです。コールバックの代わりにオブジェクトを指定するため、パラメーターはctx => value->としてコールバックを構築します。したがって、コールバックは指定したコンテキスト値を使用しません。

于 2010-03-20T19:26:28.623 に答える