در نسخههای جدید signalr بخش ارتباط با هاب نیز به شکل زیر تغییر کرده است:
const connection = new signalR.HubConnectionBuilder() .withUrl("/chatHub") .configureLogging(signalR.LogLevel.Information) .build();
const connection = new signalR.HubConnectionBuilder() .withUrl("/chatHub") .configureLogging(signalR.LogLevel.Information) .build();
var smr = new StateMachineRequest(workflowData, startId); smr.GuardClauseFromToTrigger = new StateMachineRequest.GuardClauseDelegate(this.OnFromStateToState); smr.OnEntry = new StateMachineRequest.EntryExitDelegate(this.OnEntryState); smr.OnExit = new StateMachineRequest.EntryExitDelegate(this.OnExitState); smr.Configure(); public bool OnFromStateToState(string id) { // TODO check can go to next state return true; } public void OnEntryState(string stateId) { // TODO } public void OnExitState(string stateId) { // TODO save data + save state + send an email ,Etc }
public class BlogPostStateMachine { // .... مثال قسمت دوم }
StateMachineRequest smr = new StateMachineRequest(smc, startId); smr.Configure();
private StateMachine<string, string> stateMachine; private StateMachineCOM source; private string startState; public delegate void UnhandledTriggerDelegate(State state, StateConfig trigger); public delegate void EntryExitDelegate(); public delegate bool GuardClauseDelegate(); public string Id; public EntryExitDelegate OnEntry = null; public EntryExitDelegate OnExit = null; public GuardClauseDelegate GuardClauseFromToTrigger = null; public UnhandledTriggerDelegate OnUnhandledTrigger = null; public StateMachineRequest(StateMachineCOM source, string startStateId) { this.source = source; this.startState = startStateId; } public void Configure() { this.stateMachine = new StateMachine<string, string>(startState); var states = source.States; states.ForEach(state => { var triggers = source.StateConfigs.AsQueryable() .Where(config => config.FromStateId == state.StateId) .Select(config => new {Id=config.TransitionId.ToString(), From= config.FromStateId.ToString(), To= config.ToStateId.ToString(), Permit=config.PermiteAction }) .ToList(); triggers.ForEach(trig => { this.stateMachine.Configure(state.StateId.ToString()) }); }); } public bool TryFireTrigger(string TrigerId) { if (!stateMachine.CanFire(TrigerId)) { return false; } stateMachine.Fire(TrigerId); return true; } public string GetCurrentState() { return this.stateMachine.State; }
this.stateMachine.Configure(state.StateId.ToString()) .OnEntry(() => { if (state.OnEnter) OnEntry(trig.Id);}) .OnExit(() => { if (state.OnExit) OnExit(trig.Id); }) .PermitIf(trig.From, trig.To, () => { if (trig.Permit) return GuardClauseFromToTrigger(); return true; });