Рабочий процесс как система для изменения потока кода
Мне нужен совет относительно требования в одном из наших проектов. Мы пытаемся добиться того, чтобы мы хотели контролировать поток вызовов методов из текстового или XML-файла.
Например:
string response = new Assembly1.Class1().DoStuff();
if (response == "OK")
{
new Assembly1.Class2().DoStuff();
}
else if (response == "NOTOK")
{
new Assembly2.Class1().DoStuff();
}
Как я могу представить приведенный выше код в каком-то формате, который может быть изменен нетехническим пользователем, чтобы изменить последовательность вызовов функций.
3 ответа
По сути, вы должны решить, что вы пытаетесь достичь.
Код C# содержит определенную сложность, но вся эта сложность есть, потому что код C# очень гибок.
Вы должны решить, какую гибкость вы хотите дать своим нетехническим пользователям. Если вы хотите дать им ту же гибкость, что и в C#, вы можете просто настроить их на C#.
В противном случае первым шагом будет создание языка, специфичного для домена, который описывает конфигурацию, которую они собираются выполнить. Однако, прежде чем сделать это, вы, возможно, захотите выяснить, существуют ли какие-либо языки, специфичные для предметной области, которые уже выполняют то, что вы описываете.
Следующий шаг, определив предметно-ориентированный язык, состоит в том, чтобы проанализировать и интерпретировать этот язык. Это относительно сложно и обычно является предметом одного семестрового курса в колледже под названием "Компиляторы". Если вы еще не прошли курс компиляторов, есть книги, которые вы можете прочитать. Вы можете пропустить много шагов, используя язык разметки, такой как XML, и стандартную библиотеку синтаксического анализа XML.
Я думаю, что вы можете использовать отражение для этой цели или генерировать код на лету из xml. Здесь много образцов.
Шаблон фабричного дизайна может быть полезным для вас. С фабричным шаблоном вы можете назначить объекты во время выполнения и позволить этим объектам определять ход процесса...
Вы должны создавать разные классы с помощью метода скажем WorkFlow() (на который ссылается интерфейс). Метод должен иметь возможность вызывать другие методы в зависимости от необходимости.
В начале процесса вы просто читаете файл XML и создаете объект для соответствующего класса и вызываете метод потока операций этого класса, который будет выполнять предварительно определенную последовательность.