2011-05-04 5 views
2
public interface IRule 
{ 
    bool Check(string input); 
} 

나는 규칙을 정의하는 인터페이스가 있습니다. 규칙은 사용자가 작성할 수있는 일반 비즈니스 규칙 또는 제약 조건입니다.사용자 당 비즈니스 규칙 저장

public class ContainsRule : IRule 
{ 
    public string MustContain { get; set; } 

    public bool Check(string input) 
    { 
     return input.Contains(this.MustContain); 
    } 
} 

public class LengthRule : IRule 
{ 
    public int MaxLength { get; set; } 

    public bool Check(string input) 
    { 
     return input.Length <= this.MaxLength; 
    } 
} 

규칙을 설정할 수 있습니다 하나 개 이상의 속성을 가질 수 있지만,이 예에서, 이러한 각 규칙은 하나 개의 속성이 : 그래서 두 개의 샘플 규칙이 있습니다.

사용자는 저장할 고유 한 규칙 집합을 만들 수 있습니다. 예를 들어, 사용자에게는 다음 세 가지 규칙이 있습니다.

IRule[] rules = new IRule[] 
{ 
    new ContainsRule { MustContain = "foo" }, 
    new ContainsRule { MustContain = "bar" }, 
    new LengthRule { MaxLength = 5} 
}; 

이 정보를 데이터베이스 또는 각 사용자의 데이터 저장소에 저장해야합니다. 각 사용자는 자신 만의 규칙 집합을 가질 수 있으므로 데이터베이스 테이블이 어떤 모양인지 잘 모르겠습니다.

User | ClassName    | Parameters 
----------------------------------------------- 
1  | Namespace.ContainsRule | MustContain:foo 
1  | Namespace.ContainsRule | MustContain:bar 
1  | Namespace.LengthRule | MaxLength:5 

처음에는 매개 변수가 문자열이어야하는 위와 같은 표를 만드는 것이 좋습니다. 즉, 정보를 분석하고 속성을 설정하기 위해 반사 등을 사용해야합니다. ClassName 열을 사용하여 클래스를 생성하려면 활성자를 사용해야합니다. 또 다른 제안은 모든 속성에 대해 구분 된 문자열을 만드는 대신 다른 테이블을 만드는 것입니다. 각 특성은 위 표의 행과 다시 외래 키 관계가있는 자체 행입니다.

그러나 두 예제 모두 이러한 규칙을 저장하는 가장 좋은 방법은 아닙니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

1

왜 XML 직렬화를 사용하지 않을까요? 데이터베이스 테이블은 개별 규칙의 사용자 # 및 XML 직렬화를 포함합니다.

+0

규칙을 deserialize 할 때 XmlSerializer를 인스턴스화해야합니다. XmlSerializer의 생성자에는 형식이 필요합니다. 이 규칙들 각각을 인터페이스 (IRule)라고 부르기 때문에, 내가 역 직렬화하는 타입을 어떻게 알 수 있습니까? – David

+0

XmlSerializer를 설정할 때 기본 형식을 지정하고 허용되는 모든 하위 형식을 지정할 수 있습니다. http://msdn.microsoft.com/en-us/library/e5aakyae.aspx를 참조하십시오. –

0

나는 데이터베이스에서 검색한다고 생각합니다.
그렇다면 내 제안을 시도하십시오.

검색된 데이터를 데이터 테이블에 저장하거나 규칙을 적용하기 전에 데이터 테이블로 변환하십시오.
따라서 규칙은 데이터 테이블의 필터 속성에 일반적인 sql으로 넣을 수 있습니다. 대신에 규칙 이름과 매개 변수의 , 당신은
column like '%foo%'

는 그런 다음 데이터 테이블의 필터에 적용이 포함 된 열을 변경할 수 있습니다.

PS : 나는 데이터 테이블에 목록을 변환하고, 간단하게 만 기술이 있다면 당신이이 작업을 수행하는 수 (SQL 테이블에 객체를 매핑 할 필요가 넣어

그것은 나에게 보인다
0

전에 같은 필터를 사용했다 자동으로 ... :)

게시 한 내용을 바탕으로 규칙의 하위 클래스가있는 경우 적어도 6 개의 SQL 테이블을 더 상상합니다.

  • 규칙
  • MustContainTextRules (규칙 서브 1 : 0..m)
  • MaxLengthRules (규칙 서브 1 : 0..1) 규칙의 예컨대
  • [Possibily 상기 서브 MinLengthRules?]
  • 규칙 집합 ("규칙 세트")들이 별개의 테이블이 규칙 상호 예컨대 여부에 의해 영향을받을 수있다 여부
  • 사용자 (사용자 및 규칙 집합의 관계 표)
  • RulesetOwnership

Ruleset에 대한 MinLengthRule 값이 MaxLengthRule 값을 초과 할 수 없으면 다른 테이블에있을 때이를 확인하기 위해 SQL 제약 조건을 작성하는 것이 어려울 수 있습니다.

관련 문제