2015-12-15 3 views
0

Я работаю над приложением C# MVC. У меня есть сценарий, где я хочу знать, какой дизайн-паттерн будет лучше всего подходит для него.Какой шаблон дизайна подходит для этого сценария C#?

Сценарий:

Я должен выполнить некоторую последовательность действий для субъекта. Нравится:

Step-1 Entity Created 
Step-2 Entity Approved 
Step-3 Entity Assigned to someone 
Step-4 Entity Publish 
.. 
.... 

Эти шаги сконфигурированы в любой момент времени, когда администратор может включать и выключать некоторые необязательные шаги. Например:

Если администратор отключил шаг-2, то после шага-1 мне нужно перейти непосредственно на шаге-3.

Может ли кто-нибудь помочь мне определить шаблон проектирования для вышеупомянутого сценария.

Благодаря

+0

Посетитель или цепочка командного шаблона могут работать на вас. –

+2

Прочтите банду 4. Внесите все их, а затем сообщите нам, какая из них лучшая;) –

ответ

1

Первый образец дизайна, который приходит мне на ум, - State. Вы можете заставить каждое состояние иметь метод GetNextState() (или аналогичный), который выполняет необходимую проверку и возвращает соответствующее следующее состояние.

0

Надеюсь, я правильно понимаю ваш вопрос;

Может возникнуть интерес к программированию на основе событий; https://msdn.microsoft.com/en-us/library/awbftdfh.aspx

Вы можете создать свой код шага как модули, разрешить включение и выключение флагов из «центра управления» и поднять события в соответствии с тем, какие шаги необходимо предпринять.

Это также оставляет место для многопоточных шагов (если вы решили разработать модули и можете гарантировать, что они ортогональны).

2

Это, по-моему, рабочий процесс. Microsoft имеет Workflow Engine: https://code.msdn.microsoft.com/Windows-Workflow-deed2cd5

С рабочего процесса вы можете создать Step1, Step2, Step3, как и действия рабочего процесса и шаги могут быть отключены и снова включить и т.д.

Вы также получаете конструктор рабочих процессов на основе аккуратным XAML. В приведенной ссылке есть пример кода.

+0

Вот еще одна статья, посвященная интеграции непрерывного рабочего процесса в mvc 4+. https://stevenwilliamalexander.wordpress.com/2010/11/16/integrating-a-persisted-wf40-workflow-with-mv/ –

+0

Также как еще одно замечание, если вы собираетесь когда-либо касаться sharepoint с этим материалом, рабочие процессы это круто, потому что вы можете использовать свои рабочие процессы для создания рабочего процесса и использовать их в sharepoint и присоединять их к спискам и т. д. и использовать данные списка для выполнения вашего рабочего процесса. Если вы не используете sharepoint (когда-либо), тогда подумайте о том, что вы просто используете свой государственный автомат, поскольку @Andrew предложил для простоты. Рабочий процесс хорош, но есть чему поучиться и реализовать там, и они могут стать довольно сложными. –

0

Я предлагаю вам использовать схему дизайна template method для этой ситуации.

Это обеспечивает порядок выполнения, обеспечивает возможность переключателя выключен один или несколько этапов.

Ссылка: http://www.dofactory.com/net/template-method-design-pattern

1

Может быть, вы можете попробовать Template Method Pattern с некоторыми параметрами состояния.

abstract class AbsFoo { 
    public abstract void Step1(); 
    public abstract void Step2(); 
    public abstract void Step3(); 
    public abstract void Step4(); 

    public void process(bool doStep1, 
         bool doStep2, 
         bool doStep3, 
         bool doStep4) { 
     if (doStep1) Step1(); 
     if (doStep2) Step2(); 
     if (doStep3) Step3(); 
     if (doStep4) Step4(); 
    } 
} 

class ConcreteFoo : AbsFoo { 
    public override void Step1() { 
     Console.WriteLine("Do something in step 1."); 
    } 
    public override void Step2() 
    { 
     Console.WriteLine("Do something in step 2."); 
    } 
    public override void Step3() 
    { 
     Console.WriteLine("Do something in step 3."); 
    } 
    public override void Step4() 
    { 
     Console.WriteLine("Do something in step 4."); 
    } 
} 

Затем в классе клиента вы можете вызвать метод в базовом классе.

class Client { 
    static void Main() { 
     AbsFoo foo = new ConcreteFoo(); 

     foo.process(true, false, true, true); 

     Console.ReadKey(); 
    } 
} 

Однако, если государства становятся все больше и больше, вы можете рассмотреть объединить State Pattern с этим.

+0

Почему вам нужно передать 'doStepN' методу' process'? В будущем, если вы хотите добавить step5, step6, step7, вам также нужно будет изменить метод 'process'. ** Если вы не хотите выполнять какой-либо шаг, просто оставьте его пустым в конкретном классе. ** –

+0

@ kienct89 Поскольку, передав 'doStepN' методу' process', можно динамически решить, какой метод вызывается во время программа работает. Например, я могу установить 'doStepN' на основе пользовательского ввода. Если вы оставите метод пустым в конкретном классе, вы не сможете его вызвать, когда программа запущена. – Jaege

0

Звучит как ситуация состояния конечного автомата, где шаги являются вашими объектами состояния и где каждое состояние может иметь несколько переходов выхода на основе условий (таких как параметры в настоящее время). Затем государство будет стоять за C в MVC.

Обсуждение шаблона можно найти здесь with a focus on game programming с другими примерами.

Шаблон состояния, по существу, позволит вам создать граф и, что более важно, разрешить каждому положению графа, которому будет присвоено поведение, приведет к тому, что кромка будет соблюдаться.

так что в вашем случае граф может быть определен в этом составили схему я просто придумал, как:

[state] => [transition-to] (condition) 
1 => 3 (if opt_go_to_3 == true) 
1 => 2 
2 => 3 
2 => 5 (if some_other_optioon == true) 
2 => 3 
... (etc) 

Теперь ваш код красиво объективируется, но все еще довольно гибкий. Когда дело доходит до поведения, вам нужно работать на основе условия.

Теперь, если этот объект состояния используется в качестве контроллера в вашей схеме MVC, он на самом деле все хорошо сочетается.

Текущее состояние вашего конечного автомата может создавать новые представления при вводе на основе некоторых данных модели.

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

Вместо этого подумайте об использовании интерфейса типа «доска» или «доска объявлений». Эта идея гласит, что каждое состояние должно иметь интерфейс для записи сообщения в объект.

Это можно сделать с помощью делегатов на C#, передав объект в каждое состояние при его создании или любой другой шаблон, который даст всем состояниям на компьютере доступ к этому «глобальному» ресурсу.

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

Смежные вопросы