12

現在Ninjectで直面している課題は、Ninjectを使用するRebind<>()と、条件付きのバインディングも含めて、すべてのバインディングが削除されることです。以下にばかげた例を挙げましょう。基本的に、私の場合、望ましくない動作を見つけたのは、Rebindが呼び出されると、無条件WhenInjectedInto<T>を単に上書きするのではなく、条件付きバインディングが削除されるということBind<T>です。以下のサンプルContract.Assert(cat is Wild);では、​​ctorのコントラクトは再バインド後に失敗します。

私がやりたいことをする方法はありますか?すでに注入された条件付きバインディングを保持し、非条件付きバインディングのみを上書きする機能です?

PS:実際には、(リクエストまたは非同期コマンドで)注入された場所に応じて、DataContextスコープを使用していくつかの興味深いことを実行しようとしています。

void Main()
{
    StandardKernel kernel = new StandardKernel();

    kernel.Bind<ICat>().To<Wild>();
    kernel.Bind<ICat>().To<Wild>()
        .WhenInjectedInto<EvilCat>();

    kernel.Rebind<ICat>().To<Domestic>();

    Contract.Assert(kernel.Get<ICat>() is Domestic);
    kernel.Get<EvilCat>();
}

interface ICat {}

class Domestic : ICat {}

class Wild : ICat { }

class EvilCat
{
    public EvilCat(ICat cat) {
        Contract.Assert(cat is Wild);
    }
}
4

1 に答える 1

12

これを試して:

kernel.GetBindings(typeof(ICat)).
            Where(binding => !binding.IsConditional).
            ToList().
            ForEach(
                binding => 
                    kernel.RemoveBinding(binding)
            )

kernel.Bind<ICat>().To<Domestic>();

もちろん、foreachでLINQなしでそれを行うことができます:

var bindings = kernel.GetBindings(typeof(ICat)).ToList();
foreach(var binding in bindings)
{
     if (!binding.IsConditional)
          kernel.RemoveBinding(binding);
}

kernel.Bind<ICat>().To<Domestic>();
于 2012-11-28T21:10:07.877 に答える