Qual è la soluzione degli stati e delle azioni dinamici basati su enum utilizzati in un progetto

1

Recentemente ho iniziato a lavorare su un progetto in cui abbiamo un motore del flusso di lavoro che ha la flessibilità di aggiungere stati dinamici e corrispondenti azioni per ogni stato e tutti questi sono memorizzati in Banca dati.
Per esempio:

Nome del flusso di lavoro : fai colazione
ID del flusso di lavoro : 143


Stati del flusso di lavoro
stato 1 : accensione stufa | Id stato 1121
workflowid 143
stato 2 : prepara la colazione
Id di stato 1122
workflowid 143

e poi ci sono azioni che l'utente può eseguire in ogni stato

Nome azione : Approva
Id azione : 0098
belongstostate : 1121

Nome azione : rifiuto
ID azione : 0099
belongstostate : 1121
....
Ora il codice funziona usando le dichiarazioni if else e mappando tutto a enum che è un casino.

Stavo pensando di applicare un modello di strategia per risolvere il problema, ma poi non possiamo perché qui tutto è dinamico. possiamo avere n numero di flussi di lavoro, stati e azioni.

qual è il modo migliore per affrontare questo problema?


Modifica
Il problema principale è che dobbiamo aggiungere manualmente l'id degli stati corrispondenti, azioni nel lato dell'enum che significa che cambierà anche con ogni ambiente. E dobbiamo usare se lo stato == enumofstate quindi fare questo altrimenti quello

Quello che sto cercando, potrebbe essere, è qualcosa come "modello di macchina dello stato" ma dinamico, c'è qualcosa di simile?

    
posta digi 29.03.2018 - 09:49
fonte

1 risposta

1

Bene. Puoi correggere il tuo problema immediato cambiando i tuoi ID in stringhe e popolandoli con il nome Enum

Questo significa che puoi leggere il database senza avere il codice aperto per tradurre i numeri.

A lungo termine, @Neil ha ragione, è necessario spostare tutto nel codice o tutto nel database. Ma potrebbe esserci una fase intermedia in cui si elabora il database con 'worker'

Supponiamo che tu voglia inviare una email quando è stata intrapresa l'azione "fai colazione". Puoi avere un programma che controlla il db per l'ID azione 'MakeBreakFast', invia e-mail e segna l'azione.

Ora quando aggiungi una nuova azione 'MakeLunch' non succede nulla, fino a scrivi un nuovo worker che cerca le azioni 'MakeLunch'. Perché controlla se sono stati eseguiti prima di poter eseguire l'operazione e raccoglierà quelli persi.

Puoi aggiungere un semplice controllo delle azioni sconosciute, che esegue il ciclo di tutte le azioni alla ricerca di quelle che non hanno enumerazione corrispondente e solleva un avviso.

Questo modello indica che non è necessario modificare il codice esistente quando si aggiungono nuove azioni. Devi solo creare un nuovo lavoratore.

In effetti hai fatto alcuni processi completamente nel database. Ovunque metto un'azione MakeBreakfast funzionerà senza modifiche al codice.

Forse puoi unirti a "MakeBreakfast" e "MakeLunch" in un'unica azione "SendEmail" con un parametro "Lunch" o "BreakFast"?

Si spera che gradualmente si operino tutte le azioni fino a quando non sono abbastanza generiche da poter definire nuovi processi dal pool di azioni esistenti.

    
risposta data 29.03.2018 - 16:36
fonte