Sto cercando un consiglio di progettazione per il seguente scenario:
Applicazione a tre livelli:
- MVC Portal (solo l'app frontend in realtà)
- Business logic WebApi (tutta la magia accade qui)
- Servizi connessi (solo i servizi di elaborazione file qui)
Il portale non è a conoscenza di alcun database, servizi di elaborazione, ecc. comunica solo con Business WebApi
Quindi, lo scenario aziendale è
- L'utente carica un file nel portale
- Il portale lo invia a WebApi
- Il file viene valutato, un "progetto" viene creato per questo nel database ecc.
- Il flusso di lavoro è costruito sulla base del risultato della valutazione del file e forse anche di alcune impostazioni del progetto.
Il flusso di lavoro è costituito da passaggi, che sono essenzialmente attività di elaborazione gestite dai servizi connessi (il terzo livello).
Ad esempio:
- Passaggio 1 - CleanerService
- Passaggio 2 - PreprocessoreServizio
- Passaggio 3 - PostprocessorService
- Passaggio 4 - PublisherService
Ognuno di questi passaggi richiederà parecchio tempo, quindi invece di attendere attivamente il risultato, invierò semplicemente una richiesta e restituirò un risultato immediato (accettato per l'elaborazione).
Quindi, una volta che un servizio viene eseguito con il file, invierà una richiamata a Business WebApi. Molto probabilmente, tornando al controller da cui proveniva la richiesta.
Avrò una semplice classe WorkflowManager che cercherà il database per il flusso di lavoro per un determinato file, otterrà un ID successivo, identificherà il tipo di servizio e invierà il file a questo servizio.
Ecco dove inizia la domanda effettiva
Come gestisco correttamente una comunicazione tra ciascuno dei controller di servizio e un WorkflowManager?
Ad esempio, il controller CleanerService (nel codice para;))
public class CleanerServiceController : ApiController
{
[HttpPost]
public async Task<StepTriggerResult> SendCleaningJob(File file)
{
// this action is called by the Portal
// and it uses its HttpClient to send another Post to a proper service
}
[HttpPost]
public async Task CleaningCompleteCallback(File file)
{
//I could maybe call a workflow manager here e.g.
this.workflowManager.StartNextStep(file);
// the start next step would figure out the controller for the next step service and call action similar to SendCleaningJob(file);
}
}
Tuttavia, aggiungere workflowManager ai controller per le azioni sembra un po 'hacky. Penso che sarebbe meglio averlo centralizzato in qualche modo, piuttosto che sparsi su tutti i controller. Forse un controller API condiviso per tutti i callback sarebbe meglio.
Qualche idea?