我有这个:
interface IValidator
{
bool InputOK(Text);
}
class ValidatorChain : IValidator
{
ValidatorChain(IEnumerable<IValidator> other_validators_in_order) {...}
bool InputOK(Text) { return other_validators_in_order.All(v=>v.InputOK(Text)); }
}
ConcreteValidator1 : IValidator {...}
ConcreteValidator2 : IValidator {...}
ConcreteValidator3 : IValidator {...}
我想使用ninject绑定它,这很容易;
Bind<IValidator>.To<ConcreteValidator1>();
Bind<IValidator>.To<ConcreteValidator2>();
Bind<IValidator>.To<ConcreteValidator3>();
现在,问题在于我想在其他地方使用链,只需在那里注入链。如果我试试
Bind<IValidator>.To<ConcreteValidator1>().WhenInjectedExactlyInto(typeof(ValidatorChain));
Bind<IValidator>.To<ConcreteValidator2>().WhenInjectedExactlyInto(typeof(ValidatorChain));
Bind<IValidator>.To<ConcreteValidator3>().WhenInjectedExactlyInto(typeof(ValidatorChain));
Bind<IValidator>.To<ValidatorChain>();
它似乎首先起作用,但由于最后一行,我得到循环依赖。
我在When
对最后一次绑定做了一些尝试,但没有让它起作用。
我该如何解决这个问题?
编辑:另外,我应该补充一点,我不想在课程中添加任何属性。
答案 0 :(得分:1)
因此,为了修复循环依赖关系,当目标本身为ValidatorChain
时,不应该应用最后一个绑定。这就像WhenNotInjectedInto(typeof(ValidatorChain))
,当然不存在,但你可以通过使用When
并检查目标类型来获得相同的结果:
Bind<IValidator>().To<ValidatorChain>()
.When(req => req.Target == null || req.Target.Type != typeof(ValidatorChain));
即当目标为空(有人称为ValidatorChain
)或目标不是kernel.Get<IValidator>()
本身时,请解析为ValidatorChain
。
答案 1 :(得分:1)
...怪异 我玩了它,发现以下工作:
Bind<IValidator>().To<ValidatorChain>()
.When(req => req.Target == null || req.Target.Type != typeof(IEnumerable<IValidator>));
这当然不是很强大,但在这种情况下,我可以完全控制使用情况。 它看起来好像是“请求的类型”而不是“请求对象”。