Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一种抽象子流程成功/失败的方法_C#_.net_Visual Studio_Msmq - Fatal编程技术网

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

C# 一种抽象子流程成功/失败的方法,c#,.net,visual-studio,msmq,C#,.net,Visual Studio,Msmq,我正在处理来自MSMQ的消息 对于每条消息,有十个步骤,例如: 验证日期 验证信息 验证临床信息 如果这三个步骤中的任何一个都失败了,我想抛出这个消息 有人能举出一个例子来说明这一原则吗?我不知道如何组织我的课程 比如说 public class VerifyDates() { private validateSomething ValidateSomething(); public VerifyDates() { validateSomething =

我正在处理来自MSMQ的消息

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

  • 验证日期
  • 验证信息
  • 验证临床信息
  • 如果这三个步骤中的任何一个都失败了,我想抛出这个消息

    有人能举出一个例子来说明这一原则吗?我不知道如何组织我的课程

    比如说

    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;