Инъекция с конечными машинами и принцип разделения интерфейса

Я пытаюсь выяснить, что является лучшим способом настройки FSM, а также сохранить мои интерфейсы чистыми и использовать контейнер IOC для использования DI.

Давайте просто рассмотрим пример учебника по шаблону Head First из машины gumball.

interface IState
{
    InsertQuarter();
    EjectQuarter();
    TurnCrank();
    Dispense();
}

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

Мой другой связанный вопрос: как мне выполнить DI в этих состояниях? Должна ли государственная машина и государства регистрироваться в моем контейнере МОК? Предположим, у меня есть служба заказа и служба инвентаризации, которые имеют зависимость от StageOrderState. Какова может быть эта объектная модель? Мне сложно переваривать, как на самом деле вводить зависимости в эти состояния. Я предполагаю, что я мог регистрировать состояния и передавать контейнер в состояния.

2 голоса | спросил disjointed 15 +04002013-10-15T19:49:14+04:00312013bEurope/MoscowTue, 15 Oct 2013 19:49:14 +0400 2013, 19:49:14

1 ответ


2

Мне кажется, что вы хотите обобщить пример Head First, чтобы он мог принимать произвольный набор действий.

В C # вы можете иметь первоклассные функции, что означает, что вы можете передавать функции на конечный конечный автомат и поддерживать эти функции в списке. Что-то вроде:

interface IState
{
    void AddStep(Action<T> action);
}

А затем просто передайте свою функцию методу AddStep для вставки в список конечным автоматом.

public class StateMachine : IState
{
    List<Action<T>> actions;

    public void AddStep(Action<T> action)
    {
        actions.Add(action);
    }
}

Затем вы просто добавляете свои действия.

var machine = new StateMachine();
machine.AddStep(x => Console.WriteLine(x.ToString()));
ответил Robert Harvey 15 +04002013-10-15T20:21:19+04:00312013bEurope/MoscowTue, 15 Oct 2013 20:21:19 +0400 2013, 20:21:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132