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 열을 사용하여 클래스를 생성하려면 활성자를 사용해야합니다. 또 다른 제안은 모든 속성에 대해 구분 된 문자열을 만드는 대신 다른 테이블을 만드는 것입니다. 각 특성은 위 표의 행과 다시 외래 키 관계가있는 자체 행입니다.
그러나 두 예제 모두 이러한 규칙을 저장하는 가장 좋은 방법은 아닙니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
규칙을 deserialize 할 때 XmlSerializer를 인스턴스화해야합니다. XmlSerializer의 생성자에는 형식이 필요합니다. 이 규칙들 각각을 인터페이스 (IRule)라고 부르기 때문에, 내가 역 직렬화하는 타입을 어떻게 알 수 있습니까? – David
XmlSerializer를 설정할 때 기본 형식을 지정하고 허용되는 모든 하위 형식을 지정할 수 있습니다. http://msdn.microsoft.com/en-us/library/e5aakyae.aspx를 참조하십시오. –