我有一系列我需要在应用程序上运行的验证器:
public class Validator1 : IValidator
{
public IObservable<ValidatorResult> Validate()
{
....
}
}
...
public class Validator2 : IValidator // this validator will return a fail
...
public class Validator3 : IValidator
...
现在,我需要按顺序运行它们,直到一个失败(ValidatorResult.Status == Status.Fail
(。Where
是我的第一个想法,但是当然,这不是一个很好的解决方案,因为它会杀死整个链。
所以我尝试了
之类的东西Validator1.Validate(address)
.Concat(Validator2.Validate(address)).Where(x => x.Status == ValidatorStatus.Successful)
.Concat(Validator3.Validate(address))
,但最终链中未包含Validator2
,并且Validator3
最终被称为。
所以,我在这里想要的是,验证器和验证器2的信号会击中我的 Subscribe()
,但之后什么也没有。
这将完成工作:
var chain = new IValidator[]
{
new Validator1(),
new Validator2(),
new Validator3()
};
chain
.Select(v => v.Validate())
.Concat()
.TakeWhile(vr => vr.Status == ValidatorStatus.Successful)
.Subscribe(
vr => Console.WriteLine(vr.Status),
() => Console.WriteLine("Done"));