C# 一种抽象子流程成功/失败的方法
我正在处理来自MSMQ的消息 对于每条消息,有十个步骤,例如:C# 一种抽象子流程成功/失败的方法,c#,.net,visual-studio,msmq,C#,.net,Visual Studio,Msmq,我正在处理来自MSMQ的消息 对于每条消息,有十个步骤,例如: 验证日期 验证信息 验证临床信息 如果这三个步骤中的任何一个都失败了,我想抛出这个消息 有人能举出一个例子来说明这一原则吗?我不知道如何组织我的课程 比如说 public class VerifyDates() { private validateSomething ValidateSomething(); public VerifyDates() { validateSomething =
public class VerifyDates()
{
private validateSomething ValidateSomething();
public VerifyDates()
{
validateSomething = new ValidateSomething();
}
public bool Verify()
{
validateSomething.IsValid();
}
}
假设VerifyDates()
是我的处理逻辑的一部分,我是否应该向类bool Flag添加一个公共字段来返回是否继续处理
也许我应该添加一个接口IHasFlag,其中在我的处理逻辑中使用的每个类都有一个标记,我在最后检查该标记以查看是否继续消息处理
处理消息的过程类似于这样
public void ProcessMessages()
{
var verifyDates = new VerifyDates();
if(!verifyDates.IsValid)
{
return;
}
//continue processing
//but every step of the process I would need to check IsValid for that specific class
}
如何提取连续流程中每个步骤的成功/失败?您可以使用流畅的API。类似于以下内容:
public interface IFluentValidation<T>
{
bool IsValid { get; }
T ObjectToValidate { get; }
}
internal class FluentValidation<T>: IFluentValidation<T>
{
public bool IsValid { get; }
public T ObjectToValidate { get; }
public FluentValidation(bool isValid, T target)
{
Debug.Assert(target != null);
IsValid = isValid;
ObjectToValidate = target;
}
}
您还可以对此稍加修饰,并在每个验证步骤中添加可选的自定义错误消息
public static IFluentValidation and by(此IFluentValidation目标、谓词验证器、Func failureMessageProvider=null)
并添加相应的属性string ValidationFailedMessage{get;}
至IFluentValidation
非常感谢。您能演示一下此功能的用法吗api@l--——“哎呀,愚蠢的语法错误。”。现在应该可以用了,我正在用手机打字,所以可能会有一些小错误。令人印象深刻的手机打字!!你能展示一下简单的用法吗?
public static IFluentValidation<T> ValidateBy<T>(this T target, Predicate<T> validator)
{
if (target == null) throw new ArgumentNullException(name(target));
if (validator == null) throw new ArgumentNullException(name(validator));
if (validator(target))
return new FluentValidation<T>(true, target);
return new FluentValidation<T>(false, target);
}
public static IFluentValidation<T> AndBy<T>(this IFluentValidation<T> target, Predicate<T> validator)
{
if (validator == null) throw new ArgumentNullException(name(validator));
if (!target.IsValid)
return target;
if (validator(target.ObjectToValidate)
return target;
return new FluentValidation<T>(false, target.ObjectToValidate);
}
var validated = myObject.ValidateBy(t => //whatever needs to checked t.ObjectToValidate.DateIsValid)
.ThenBy(t => ... //whatever needs to be checked t. ObjectToValidate.PatientIsValid)
.ThenBy(t => ... //t.ObjectToValidate .ClinicalInformationIsValid)
.IsValid;