Лучший способ обозначить бизнес-правила - это xml. Чтобы в полной мере воспользоваться этой нотацией, вам следует начать с определения структуры модели данных механизма правил, то есть ответить на эти вопросы.
- Каковы правила?
- Можно ли классифицировать правила?
- Содержат ли правила общие свойства (атрибуты), такие как допустимые значения, формат и т. Д .?
Как только это будет сделано, создайте фиктивные правила xml и затем создайте схему xml на основе этого xml. Инструмент xsd.exe может помочь вам в создании схемы. Схему проще создать, если вы можете использовать такие инструменты, как Altova XmlSpy .
Что касается ответов на ваши конкретные вопросы,
- Мы не можем использовать Intellisense, и если у нас есть ошибка в XML-файле, ее очень трудно найти.
После создания схемы Visual Studio предоставляет широкие возможности для создания XML (включая intellisense и проверку).
- Мы должны написать пользовательские парсеры xml
Не требуется, класс XmlSerializer предоставляет логику для сериализации / десериализации, т. Е. Для преобразования правил xml в модель данных правил и наоборот.
- Поскольку этот метод требует многократного применения, он очень медленный
Что ж, это отчасти верный момент по сравнению с жестко закодированными правилами (правилами, встроенными в вашу сборку как классы), но гибкость этого подхода намного перевешивает любые недостатки производительности. Вам не нужно перестраивать решение в случае изменения правил. В большинстве случаев влияние на производительность минимально.
Если у вас нет строгих критериев производительности, XML-подход является предпочтительным способом реализации механизма правил. Помните, что чем слабее связана ваша архитектура, тем выше гибкость во время выполнения, но это отрицательно сказывается на производительности.
Пример правила
<RulesEngine>
<Rules>
<Rule Id="Rule1">
<Function>
<Equals>
<Property name="Property1" classId="MyClassId"/>
<Sum>
<Property name="Property2" classId="MyClassId"/>
<Constant type="UInt16" value="1"/>
</Sum>
</Equals>
</Function>
</Rule>
</Rules>
<Classes>
<Class name="MyNamespace.MyClass" Id="MyClassId">
<Property name="Property1" type="UInt16"/>
<Property name="Property2" type="UInt16"/>
</Class>
</Classes>
</RulesEngine>
Механизм правил должен интерпретировать это правило и соответствующим образом вывести значение.