1

我有这个:

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但没有让它工作。

我该如何解决这个问题?

编辑:另外,我应该补充一点,我不想向类添加任何属性。

4

2 回答 2

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其自身时解析。

于 2013-08-06T19:39:05.180 回答
1

奇怪......我玩弄了它,发现以下工作:

Bind<IValidator>().To<ValidatorChain>()
    .When(req => req.Target == null || req.Target.Type != typeof(IEnumerable<IValidator>));

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

于 2013-08-08T16:21:21.480 回答