2016-05-22 2 views
2

Я обрабатываю сообщения из MSMQ.способ абстрагировать успех/сбой подпроцесса

Для каждого сообщения есть десять шагов, таких как:

  1. VerifyDates
  2. VerifyPatientInformation
  3. VerifyClinicalInformation

Если происходит сбой в одном из трех шагов, я бы как выкинуть сообщение.

Может ли кто-нибудь указать на пример SOLID, демонстрирующий этот принцип? Я не уверен, как структурировать мои классы.

Например

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

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

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

} 

Если предположить, что VerifyDates() является частью моей логики обработки, я должен быть добавление публичного поля к классу BOOL Флаг, который возвращает или не продолжать обработку?

Возможно, я должен добавить интерфейс 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 
} 

Как вы абстрагировать успех/провал каждого шага в процессе последовательного?

ответ

2

Вы можете использовать свободный 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

+0

большое спасибо вы можете продемонстрировать использование этого API –

+0

http://i.imgur.com/nXyz7a7.png –

+0

http://i.imgur.com/bXUFlZl .png –

Смежные вопросы