Динамически загружаемый класс для правил движка - PullRequest
0 голосов
/ 05 октября 2011

У меня есть 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>

Я обрабатываю только один список правил за раз.

ДолженЯ добавляю дополнительный атрибут XML для каждого правила, определяющего имя класса для загрузки?Как я не хочу использовать код в качестве имени класса?Или я могу просто добавить код в качестве атрибута в мой класс и использовать его для его динамической загрузки

Например

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

Могу ли я загрузить классы из [code = 0045] или следуетЯ только что сохранил «IsValidColor» в XML.Есть ли разница в производительности.

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Ваш синтаксис атрибута не работает.Но что-то вроде [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();
1 голос
/ 05 октября 2011

Любой из вариантов будет иметь аналогичную производительность.Если коды ошибок, сообщения об ошибках и порядок никогда не будут различаться в разных XML-файлах, вы можете вместо этого иметь все метаданные о правиле внутри атрибута и во время выполнения перечислять все классы, которые реализуют IisValid:

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

Однако, если все это настраиваемо, я бы лично предложил XML-файлу указать имена используемых классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...