NInject验证器链;聚合实现相同的接口

时间:2013-08-06 16:52:35

标签: c# ninject

我有这个:

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对最后一次绑定做了一些尝试,但没有让它起作用。

我该如何解决这个问题?

编辑:另外,我应该补充一点,我不想在课程中添加任何属性。

2 个答案:

答案 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>));

这当然不是很强大,但在这种情况下,我可以完全控制使用情况。 它看起来好像是“请求的类型”而不是“请求对象”。