1

여러 개의 유효성 검사 엔티티를 수집 할 수 있으며 모두 동일한 인터페이스를 공유하고 싶습니다.Multipe Strategy Design Pattern

public interface Ivalidateable 
{ 
    bool IsValid(IValidateParam param); 
} 

public interface IValidateParam 
{ 

} 

public abstract EmployeeStrategy: Ivalidateable 
{ 
    public abstract bool IsValid(User user); 
} 

public abstract SpreadStrategy: IValidateable 
{ 
public abstract bool IsAvlid(Campaign campaign); 
} 

public class User: IValidateParam 
{} 

public class Campaign: IValidateParam 
{} 

public EmployeeTypeStragtegy: EmployeeStrategy, IValidateable 
{ 
public bool IsValid(User user) 
{ 
    if (new[]{'e',a','b}.Contains(user.userId.first().toString())) 
    return true; 

    return false; 
} 
} 

public TrailSpreadStrategy: SpreadStrategy, IValidateable 
{ 
public bool IsValid(Campaign campaign) 
{ 
    //logic goes here 
} 
} 

public EvenpreadStrategy: SpreadStrategy:, IValidateable 
{ 
public bool IsValid(Campaign campaign) 
{ 
    //logic goes here 
} 
} 

public class ValidationFactory 
{ 
private static List<IValidateable> stragtegies; 

static ValidationFactory 
{ 
    strategies = new List<IValidateable>(); 
    strategies.Add(new EmployeeTypeStragtegy()); 
    strategies.Add(new TrailSpreadStrategy()); 
} 

public bool IsValid(//Need to pass User/Campaign) 
{ 
    //what do I do here? 
} 
} 

내가 루프 전략을 수 있고 IsValid를 확인할 수 있도록 사용자/캠페인을 통과하는 가장 좋은 방법은 무엇입니까 : 이것은 내가 생각 해낸 무엇인가?

+0

캠페인 유효성 확인을위한 두 가지 전략이 모두 실행되거나 올바른 기준을 선택하기위한 몇 가지 기준이 있습니까? –

+0

각 유형 (사용자/캠페인) 중 하나만있을 것입니다 ... 둘 이상의 선언에 대한 아이디어를 표시하고 싶습니다. –

답변

2

내가 그것을 할 거라고 방법은 다음과 같습니다 그 후

// campaign object class, and it's separate validator logic 

public class Campaign 
{ 
} 

public class CampaignValidator : IValidationStrategy<Campaign> 
{ 
    public bool IsValid(Campaign test) 
    { 
     return true; 
    } 
} 

// framework stuff 

public interface IValidationStrategy<T> 
{ 
    bool IsValid(T test); 
} 

public static class ValidationFactory 
{ 
    private readonly static Dictionary<Type, object> _typeValidators; 

    static ValidationFactory() 
    { 
     _typeValidators = new Dictionary<Type, object>(); 
     _typeValidators[typeof(Campaign)] = new CampaignValidator(); 
    } 

    public static bool IsValid<T>(T obj) 
    { 
     return ((IValidationStrategy<T>)_typeValidators[typeof(T)]).IsValid(obj); 
    } 
} 

을, 당신은 ValidationFactory.IsValid(myObject);를 호출 할 수 및 유형이 공장 정적 생성자에있는 경우, 당신이 참/거짓 줄 것이다.

유효성 검사 팩토리는 일종의 DI/IOC 일을합니다. 즉, Ninject, Castle 등을 사용하여 유형을 유효성 검사기 유형에 매핑 할 수 있습니다.

같은 방식으로 사전을 작성하지 않고도 동적으로 또는 다르게 작업 할 수 있습니다. 유효성 검사기가 구현하는 인터페이스의 제네릭 형식 매개 변수를 확인하거나 IValidationStrategy<> 기반 클래스를 검색 한 다음 제네릭 형식 매개 변수를 다시 살펴보십시오. . 그러나 위는 빠르고 간단합니다.

별도의 유효성 검사기 클래스가 필요한 이유가 있습니까?

+0

각 항목마다 유효성 검사에 차이가 있습니다. –

+0

예 그렇습니다.하지만 IsValid를 포함하지 않는 이유는 무엇입니까? 각 객체 자체에? :) –

+0

내가 너를 잡았다 고 생각해! 감사! 내가 루프를 통과하고 각 전략에 대해 IsValid를 호출하는 이유는 각각에 대해 IsValid가있는 이유입니다. –

0

어때요?

변경 예를 들어,이 프로토 타입 (사용자 사용자, 캠페인 캠페인)을 사용하도록 IsValid의 모든 :

public EmployeeTypeStragtegy: EmployeeStrategy, IValidateable 
{ 
public bool IsValid(User user, Campaign campaign) 
{ 
    return (new char[]{'e','a','b'}.Contains(user.userId.first().toString()); 
} 
} 

그리고 적절한 형태로 각, 모두 동일한 인수를 사용할 그런 식으로 처리합니다. 다음 :

public bool IsValid(User user, Campaign campaign) 
{ 
    bool valid; 

    foreach (IValidateable iv in strategies) 
    { 
     if (!iv.IsValid(user, campaign)) 
      valid = false; 
    } 

    // This returns true if all are valid, false if not (not sure if this is the logic you expect) 
    return valid; 
} 
+0

다음과 같이하고 싶습니다. public bool IsValid (사용자 사용자, 캠페인 캠페인) { return strategies.All (s => s.IsValid (// ???)) } –

+0

따라서 1 명의 사용자와 1 명의 캠페인을 제공하고 모든 전략을 반복하여 해당 전략이 타입? – crlanglois

+0

정확히 crlangois !!! 전략이 Employee를 기반으로한다면 SpreadStrategy는 사용자를 사용합니다. 캠페인을 사용합니다. –

0

나는 FluentValidation의 중첩 수집 및 검증 기능을 살펴 가지고 추천 할 것입니다. 여분의 팩토리 및 인터페이스가 없어도 잘 작동 할 것입니다. 전략에 따라 유효성을 검사하려는 다른 엔티티에 대한 참조가있는 경우에도 마찬가지입니다. 여기