Ninject目前面临的挑战是,当我使用Rebind<>()它时,它会删除所有绑定,即使是那些有条件的绑定.我在下面给你一个愚蠢的例子.基本上我发现在我的情况下不受欢迎的行为是,当调用Rebind时,它将删除条件WhenInjectedInto<T>绑定而不是仅覆盖非条件绑定Bind<T>.在合同下方的样本中Contract.Assert(cat is Wild);在重新绑定后,中将失败.
有没有办法做我想要的 - 保持已注入条件绑定并仅覆盖非条件绑定的能力?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 12
试试这个:
kernel.GetBindings(typeof(ICat)).
Where(binding => !binding.IsConditional).
ToList().
ForEach(
binding =>
kernel.RemoveBinding(binding)
)
kernel.Bind<ICat>().To<Domestic>();
Run Code Online (Sandbox Code Playgroud)
当然,你可以在没有LINQ的情况下做到这一点:
var bindings = kernel.GetBindings(typeof(ICat)).ToList();
foreach(var binding in bindings)
{
if (!binding.IsConditional)
kernel.RemoveBinding(binding);
}
kernel.Bind<ICat>().To<Domestic>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2867 次 |
| 最近记录: |