Advertisement
Guest User

Untitled

a guest
Feb 29th, 2020
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.95 KB | None | 0 0
  1. ## Я хочу добавить новое состояние, что мне нужно сделать?
  2.  
  3. Для того, чтобы добавить новое состояние, нужно выполнить 2 шага:
  4.  
  5. 1. В папке `Features` создать папку с именем состояния. В нашем случае это `ApplicationConsideration`. В папке создать класс `ApplicationConsiderationState` и выполнить наследование от класса `ProcedureState<TState>`.
  6.  
  7. ```csharp
  8.  
  9. /// <inheritdoc />
  10. public sealed class ApplicationConsiderationState : ProcedureState<ApplicationConsiderationState>
  11. {
  12. /// <inheritdoc />
  13. public ApplicationConsiderationState(
  14. IStateDescriptor<Procedure, ApplicationConsiderationState> descriptor,
  15. IStateActionExecutionProvider<Procedure, ApplicationConsiderationState> provider)
  16. : base(descriptor, provider)
  17. { }
  18. }
  19.  
  20. ```
  21.  
  22. 2. Зарегистрировать состояние в контейнере зависимостей.
  23.  
  24. ```csharp
  25.  
  26. container.AddStateMachine<Procedure>(assemblies)
  27. .AddState<ApplicationConsiderationState>();
  28.  
  29. ```
  30.  
  31. ## Я хочу добавить новое действие, что мне нужно сделать?
  32.  
  33. Для того, чтобы добавить новое действие, нужно выполнить 3 шага:
  34.  
  35. 1. Если действие общее для нескольких состояний, тогда в папке c проектом создать (если еще не создана) папку `StateActions`. В этой папке создать класс действия (например, `SchedulerStateAction`). Если действие относиться только к одному состоянию, тогда необходимо в папке с классом состояния создать (если еще не создана) папку `StateActions`. Если действие сложное, то есть может содержать дополнительные данные или результат, следует создать отделную папку с названием действия. В папке разместить само действие, а также `ActionData` и `ActionResult`.
  36.  
  37. ### PublishProtocolStateAction.cs
  38.  
  39. ```csharp
  40.  
  41. using System;
  42.  
  43. /// <summary>
  44. /// Действие публикации протокола.
  45. /// </summary>
  46. public sealed class PublishProtocolStateAction : StateAction<PublishProtocolStateActionData, PublishProtocolStateActionResult>
  47. {
  48. /// <summary>
  49. /// Инициализирует экземпляр <see cref="PublishProtocolStateAction" />.
  50. /// </summary>
  51. public PublishProtocolStateAction(PublishProtocolStateActionData data)
  52. : base(data, nameof(PublishProtocolStateAction), DateTime.UtcNow)
  53. { }
  54.  
  55. /// <summary>
  56. /// Инициализирует экземпляр <see cref="PublishProtocolStateAction" />.
  57. /// </summary>
  58. public PublishProtocolStateAction(PublishProtocolStateActionData data, string name, DateTime date)
  59. : base(data, name, date)
  60. { }
  61. }
  62.  
  63. ```
  64.  
  65. ### PublishProtocolStateActionData.cs
  66.  
  67. ```csharp
  68.  
  69. /// <summary>
  70. /// Данные для выполнения действия публикации протокола.
  71. /// </summary>
  72. public sealed class PublishProtocolStateActionData
  73. {
  74. /// <summary>
  75. /// Идентификатор протокола.
  76. /// </summary>
  77. public int ProtocolId { get; set; } = 666;
  78. }
  79.  
  80. ```
  81.  
  82. ### PublishProtocolStateActionResult.cs
  83.  
  84. ```csharp
  85.  
  86. using System.Collections.Generic;
  87.  
  88. /// <summary>
  89. /// Результат выполнения действия публикации протокола.
  90. /// </summary>
  91. public sealed class PublishProtocolStateActionResult
  92. {
  93. /// <summary>
  94. /// Саги на блокировку денежных средств.
  95. /// </summary>
  96. public List<object> BlockMoneySagas = new List<object>();
  97. }
  98.  
  99. ```
  100.  
  101. 2. Связать добавленное действие с нужными состояниями. Для этого нужно добавить атрибут `StateAction` над классом нужного состояния и передать в него тип нужного действия.
  102.  
  103. ```csharp
  104.  
  105. /// <inheritdoc />
  106. [StateAction(typeof(PublishProtocolStateAction))] // <-- HERE
  107. public sealed class ApplicationWinnerDeterminationState : ProcedureState<ApplicationWinnerDeterminationState>
  108. {
  109. /// <inheritdoc />
  110. public ApplicationWinnerDeterminationState(
  111. IStateDescriptor<Procedure, ApplicationWinnerDeterminationState> descriptor,
  112. IStateActionExecutionProvider<Procedure, ApplicationWinnerDeterminationState> provider)
  113. : base(descriptor, provider)
  114. { }
  115. }
  116.  
  117. ```
  118.  
  119. 3. Добавить обработчик действия для конкретного состояния. Почему для конкретного? Потому что некоторые (общие) действия могут использоваться из разных состояний, но логика у них должна быть разная. Для этого нужно в папке, где находится состояние, добавить еще папку `StateActionExecutors`. А в ней уже создать обработчик (средство для выполнения действия). **Регистрировать обработчики явным образом не нужно.**
  120.  
  121. ```csharp
  122.  
  123. using System;
  124. using Models;
  125. using StateActions.PublishProtocol;
  126.  
  127. /// <inheritdoc />
  128. public sealed class ApplicationWinnerDeterminationPublishProtocolActionExecutor : ProcedureStateActionExecutor<ApplicationWinnerDeterminationState, PublishProtocolStateAction>
  129. {
  130. /// <inheritdoc />
  131. protected override void BeforeExecute()
  132. {
  133. if (ExecutionContext.GetProcedureState() != ProcedureStateEnum.ApplicationWinnerDetermination)
  134. throw new StateMachineException("Процедура находиться в статусе, непригодном для выполнения действия.");
  135. }
  136.  
  137. /// <inheritdoc />
  138. protected override void Execute()
  139. {
  140. Console.WriteLine($"Идентификатор публикуемого протокол: {ExecutionContext.GetProtocolId()}.");
  141.  
  142. // Add few block money sagas.
  143. ExecutionContext.AddBlockMoneySaga(new { Id = 1 });
  144. ExecutionContext.AddBlockMoneySaga(new { Id = 2 });
  145. ExecutionContext.AddBlockMoneySaga(new { Id = 3 });
  146.  
  147. ExecutionContext.SetProcedureState(ProcedureStateEnum.ContractConclusion);
  148. }
  149.  
  150. /// <inheritdoc />
  151. protected override void AfterExecute()
  152. {
  153. Console.WriteLine($"Протокол с идентификатором {ExecutionContext.GetProtocolId()} опубликован.");
  154. }
  155. }
  156.  
  157. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement