Получить разрешенные триггеры с защитными условиями в Stateless (.NET State Machine Library)

Фон:

У меня такой же Trigger с взаимоисключающими guard условия, определенные с PermitIf это приведет к переходу в разные состояния в зависимости от этих условий.

Охранники имеют Descriptions определены, и они хорошо отображаются в скобках в экспортированном графике DOT, так что это легко выполнить.

machine
   .Configure(Status.Registered)
   .PermitIf(Activity.Submit, Status.Submitted, IsGoodRating, "Is good  rating")
   .PermitIf(Activity.Submit, Status.Denied, IsBadRating, "Is bad rating")

Теперь я знаю, что есть machine.PermittedTriggers свойство, которое возвращает разрешенные триггеры в текущем состоянии, и это здорово, но вот вопрос.

Вопрос:

Есть ли способ получить список PermittedTriggers с соответствующими условиями охраны для статуса Registered в этом случае?

1 ответ

Решение

Я думаю, вы могли бы сделать что-то вроде этого, но... я не знаю, насколько это полезно:

 class Program
{
    enum Status { Registered, Submitted, Denied }

    static void Main(string[] args)
    {
        int currentRating = 91;
        RatingTrigger RatingTrigger = new RatingTrigger();

        StateMachine<Status, Trigger> _sm = new StateMachine<Status, Trigger>(Status.Registered);
        _sm.Configure(Status.Registered)
            .PermitIf(RatingTrigger, Status.Submitted, () => RatingTrigger.Guard(currentRating), RatingTrigger.GuardDescription)
            .PermitIf(RatingTrigger, Status.Denied, () => RatingTrigger.Guard(currentRating), RatingTrigger.GuardDescription);

        var list = _sm.PermittedTriggers;

        foreach (var item in list)
        {
            if (item.GetType().Equals(typeof(RatingTrigger)))
            {
                Console.WriteLine(((RatingTrigger)item).GuardDescription);
            }
            else
            Console.WriteLine(item);
        }

    }
    private static bool evaluate()
    {
        return true;
    }
}
public abstract class Trigger
{
    public abstract bool Guard(object something);
}
public class RatingTrigger : Trigger
{
    public string GuardDescription = "This Guard evaluaties the current rating. Retuns true if good rating, false if bad rating";
    public override bool Guard(object rating)
    {
         return  (((int)rating) > 90);
    }
}
Другие вопросы по тегам