12

我目前在使用 Ninject 时面临的挑战是,当我使用Rebind<>()它时,它会删除所有绑定,即使是有条件的绑定。让我在下面给你一个愚蠢的例子。基本上,在我的情况下,我发现不受欢迎的行为是,当调用 Rebind 时,它将删除条件WhenInjectedInto<T>绑定,而不是仅仅覆盖 non-conditional Bind<T>。在下面的示例中,ctor 中的合约Contract.Assert(cat is Wild);在 Rebind 后将失败。

有没有办法做我想做的事 - 能够保持已经注入的条件绑定并只覆盖非条件绑定?

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 回答