gpt4 book ai didi

c# - 一种抽象子流程成功/失败的方法

转载 作者:行者123 更新时间:2023-11-30 23:25:18 26 4
gpt4 key购买 nike

我正在处理来自 MSMQ 的消息。

对于每条消息,有十个步骤,例如:

  1. 验证日期
  2. 验证患者信息
  3. 验证临床信息

如果这三个步骤中的任何一个失败,我都会抛出消息。

谁能指出一个 SOLID证明这个原则的例子?我不确定如何构建我的类(class)。

例如

public class VerifyDates()
{
private validateSomething ValidateSomething();

public VerifyDates()
{
validateSomething = new ValidateSomething();
}

public bool Verify()
{
validateSomething.IsValid();
}

}

假设 VerifyDates() 是我处理逻辑的一部分,我是否应该向返回是否继续处理的类 bool Flag 添加一个公共(public)字段?

也许我应该添加一个接口(interface) 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<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);
}

实现 OrBy作为 AndFinallyBy 是微不足道的如果你想返回经过验证的对象而不是 IFluentValidation<T> .

你会像这样使用它:

 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;

您还可以对此进行更多修饰,并在每个验证步骤中添加可选的自定义错误消息; public static IFluentValidation<T> AndBy<T>(this IFluentValidation<T> target, Predicate<T> validator, Func<T, string> failureMessageProvider = null)并添加相应的属性string ValidationFailedMessage { get; }IFluentValidation

关于c# - 一种抽象子流程成功/失败的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37376871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com