2011-10-04 5 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> 

私は、一度に1つのルールリストを処理します。

ロードするClassNameを定義する各ルールに追加のXML属性を追加する必要がありますか? 私はクラス名としてコードを使用したくないのですか?または私はちょうど私が[コード= 0045]からクラスをロードすることはできますか私は、「保存されなければならない私のクラスの属性としてのコードを追加して、例

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

のために動的に

それをロードするためにそれを使用することができますIsValidColor "をXMLに追加します。パフォーマンスの違いはありますか?

答えて

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")]構文を使用しました。実際にそれをフィルタリングするにはどうしたらいいですか? Assemblyクラスで使用できる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

[OK]をおかげで、イエスのみのコードが変更されない、他のすべてを、実際に、それを行う。このように属性を定義するには

属性はカスタマイズ可能です。ですから、私はXMLにを追加することができます。 – Daveo

関連する問題