2011-10-04 105 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」)]語法。我如何實際過濾?有沒有像我可以在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

好感謝的,是唯一的代碼不會改變,所有其他屬性將可定製。所以我可以在我的XML中添加。 – Daveo