Можно ли использовать запрос LINQ в условии правила рабочего процесса Windows?

Я занимаюсь созданием прототипа механизма правил, который поможет нам с нашими порталами заказов. Например, предоставление скидок на товары или требование одобрения при заказе определенных товаров. Мы также хотели бы иметь возможность добавлять правила для сумм в долларах, позиций пользователей в иерархии и применять их к одному или нескольким клиентам.

Я чувствую, что WWF является хорошим ответом на эту потребность.

Все это говорит о том, что мне немного трудно понять, как лучше настроить некоторые из более сложных правил. У меня есть «условие», которое, как мне кажется, лучше всего описать в запросе LINQ, например:

var y = from ol in currentOrder.OrderLines where ol.ItemCode == "MYITEMCODE" select ol;

Я не против использования другого фреймворка для механизма правил или добавления дополнительных свойств/методов к нашим объектам (например, OrderHasItem(ItemCode) и т. д.), чтобы сделать эти правила более простыми, но я хотел бы избежать этого. Это кажется обреченным на провал, поскольку заставляет нас пойти по пути потенциального требования изменений кода для новых правил.


person bdwakefield    schedule 26.07.2012    source источник


Ответы (2)


WF — это движок рабочего процесса. Он используется для управления заводами и банками. Механизм правил — лишь малая его часть. Чтобы иметь смысл, любой нормальный проект WF требует специальной команды профессионалов для его создания. Кажется, что это излишество для вашей конкретной цели. Скорее всего, вы похороните себя и свой проект в типичной борьбе между требованиями и реальными навыками вашей команды.

Использование любого доступного движка .NET было бы более оправданным в вашей ситуации. Имейте в виду, что создание собственного механизма правил — непростая задача, какой бы простой она ни казалась с самого начала. Установка значений свойств класса (обычно называемых «фактами» или «исходными» объектами) или выполнение действий (вызов методов класса) — это то, что механизмы правил делают лучше всего. И, похоже, это именно то, что вам нужно. Ознакомьтесь с некоторыми доступными движками .NET. Они недорогие, если не бесплатные, и надежные.

person Kizz    schedule 26.07.2012
comment
Я думаю, что FLEE выглядит многообещающе... Меня беспокоит то, что это похоже на интенсивный код. Я все еще очень хотел бы иметь возможность бросить на него запрос LINQ. Похоже, что класс пользовательских функций может быть частично полезен. - person bdwakefield; 27.07.2012
comment
Принятие этого ответа. Я все еще думаю, что WF будет работать для того, что мы хотим, но я еще не смог заставить его работать так, как примеры, которые я видел. Похоже, что FLEE будет работать, хотя похоже, что он больше зависит от обновлений кода для обновления правил, чем я надеялся. - person bdwakefield; 08.08.2012

Да, вы можете использовать запросы Linq с Workflow. В WF вы, как правило, имеете в виду выражение, которое оценивается во время выполнения. Ваш запрос выбирает подмножество упорядоченности на основе критерия.

Например, если у меня есть коллекция имен, и я хочу видеть только имена, начинающиеся с «R». Я мог бы написать следующий код.

private static void ShowQueryWithCode(IEnumerable<string> names)
{
    Console.WriteLine("LINQ Query in Code - show names that start with 'R'");

    // Assuming there are no null entries in the names collection
    var query = from name in names where name.StartsWith("R") select name;

    // This is the same thing as 
    // var query = names.Where(name => name.StartsWith("R"));
    foreach (var name in query)
    {
        Console.WriteLine(name);
    }

    Console.WriteLine();
}

Чтобы сделать то же самое с Workflow

Шаг 1. Создайте рабочий процесс с аргументом In типа IEnumerable

Здесь вы можете видеть, что я добавил входящий аргумент входящий аргумент

Шаг 2. Добавьте переменную для запроса типа IEnumerable

Прежде чем вы сможете добавить переменную, вам нужно включить действие, которое имеет переменные. В этом рабочем процессе я добавил последовательность.

переменная

Шаг 3. Назначьте запросу выражение LINQ, которое вы хотите использовать. Вы можете использовать цепочку методов или синтаксис запроса.

выражение

Шаг 4. Перебор коллекции

В завершенном рабочем процессе я использовал действие ForEach для повторения списка имен и записи их в консоль.

Workflow1

В этом примере используется C# в .NET 4.5, но тот же метод можно использовать и в Visual Basic.

Вы можете скачать образец кода здесь

person Ron Jacobs    schedule 27.07.2012
comment
Отлично! Должно ли это быть использовано так же, как в этих примерах? sanderstechnology.com/2011/ и richard-banks.org/2007/08/ - person bdwakefield; 27.07.2012
comment
Эти примеры демонстрируют, как использовать старый механизм правил рабочего процесса (WF 3.5). Я бы не рекомендовал его использовать. Правила можно рассматривать как группу операторов If/Then/Else. - person Ron Jacobs; 28.07.2012
comment
@RonJacobs Я знаю, что это устарело, но по какой-то причине во время выполнения я получаю сообщение об ошибке, из-за которого мне нужно сослаться на system.linq, когда он находится в разделе импорта размещенного дизайнера. Нужно ли мне добавить что-то еще к реальному движку wf? Спасибо. - person Thierry; 27.05.2020