2011-10-04 7 views
0

많은 규칙을 정의하는 XML 파일이 있습니다. XML 파일을 내 규칙 엔진에로드합니다.규칙 엔진에 대한 동적로드 클래스

내가로드하는 XML 파일에 따라 필요한 네임 스페이스를 선택할 필요가 있습니다. 그런 다음 XML의 각 행에서로드 할 클래스를 결정해야합니다.

내 XML

<RuleList assembly="BMW"> 
<rule> 
    <code>2345</code> 
    <errorMessage>foo bar</errorMessage> 
    <order>1</order> 
</rule> 
</RuleList> 
<RuleList assembly="FORD"> 
<rule> 
    <code>0045</code> 
    <errorMessage>foo bar</errorMessage> 
    <order>3</order> 
</rule> 
</RuleList> 

나는 한 번에 하나의 규칙리스트를 처리합니다.

로드 할 ClassName을 정의하는 각 규칙에 추가 XML 특성을 추가해야합니까? 코드를 클래스 이름으로 사용하고 싶지 않으므로? 아니면 그냥 내 클래스에 속성으로 코드를 추가하고 "

namespace FORD 
{ 
    [code=0045] 
    public bool IsValidColor(foo) : IisValid 
    { 
     return true 
    } 
} 

내가로부터 클래스를로드 할 수 [코드 = 0045] 또는 그냥 저장한다

예를 들어 동적

를로드 할 것을 사용할 수 있습니다 IsValidColor "를 사용합니다. 성능 차이가 있습니까?

답변

1

속성 구문이 작동하지 않습니다. 그러나 [Code("0045")]과 같은 것은 CodeAttribute을 만들면됩니다.

어셈블리의 모든 형식 중에서 특성을 기반으로 올바른 형식을 찾아야하기 때문에 약간의 성능 차이가있을 수 있습니다. 그러나 그 차이는 거의 무시할 만하다.

[AttributeUsage(AttributeTargets.Class)] 
class CodeAttribute : Attribute 
{ 
    public CodeAttribute(string code) 
    { 
     Code = code; 
    } 

    public string Code { get; private set; } 
} 

을 그리고 다음과 같이 클래스를 찾을 수 :

실제로이 같은 속성을 정의하려면,

var type = 
    (from t in assembly.GetTypes() 
    let attr = (CodeAttribute)t 
        .GetCustomAttributes(typeof(CodeAttribute), false) 
        .SingleOrDefault() 
    where attr != null && attr.Code == code 
    select t) 
    .Single(); 
+0

그래서 [Code ("0045")] 구문을 사용했습니다. 어떻게 실제로 필터링합니까? 어셈블리 클래스에서 사용할 수있는 linq 쿼리가 있습니까? – Daveo

+0

그래,'Assembly.GetTypes()'를 사용하고 모든 유형의 속성을 확인해야합니다. 편집을 참조하십시오. – svick

1

두 옵션 모두 비슷한 성능을 보입니다. 오류 코드, 오류 메시지 및 순서는 XML 파일에 걸쳐 변화하지 않을 경우, 당신도 대신 속성의 내부 규칙에 대해 모든 메타 데이터를 가지고 있고, 런타임에 IisValid를 구현하는 모든 클래스를 통해 열거 할 수 있습니다 :

[Rule(Code = "0045", ErrorMessage = "foo bar", Order = 1)] 
public class IsValidColor : IisValid 
{ 
    public bool IsValid(Foo bar) 
    { 
     // validation rules here 
    } 
} 

그러나이 모든 것을 사용자 정의 할 수 있다면 XML 파일에 사용할 클래스의 이름을 지정하는 것이 좋습니다.

+0

확인 감사, 예에만 코드가 변경되지 않습니다 모든 다른 속성은 사용자 정의 할 수 있습니다. 따라서 XML에 를 추가 할 수 있습니다. – Daveo