Stiamo sviluppando una soluzione totale e abbiamo scelto un'architettura orientata ai servizi per allentare i sottosistemi. Tuttavia, ora abbiamo un problema.
Quando il cliente ordina qualcosa, Ordina sottosistema è responsabile di ottenere quell'ordine e registrarlo. Tuttavia, ci sono anche altri moduli che sono responsabili, nel processo di registrazione degli ordini, e ogni modulo dovrebbe fare qualcosa su di esso:
- Il modulo Contabilità clienti dovrebbe controllare il saldo del cliente e impedire la registrazione dell'ordine se non ci sono abbastanza soldi nell'account del cliente.
- Il modulo di gestione delle risorse dovrebbe aumentare / diminuire le risorse del cliente
- Il motore di regole dovrebbe applicare dinamicamente alcune regole aziendali (come impedire un cliente specifico, o notificare un operatore, ecc.)
- CRM dovrebbe visualizzare la cronologia del cliente e offrire ai buoni clienti uno sconto
- ...
Al momento, lo stiamo facendo in questo modo:
public void RegisterOrder(Order order)
{
RuleEngineService.ApplyBusinessRules(order);
// some code here
CrmService.GiveDiscountIfApplicable(order);
// some code here
CustomerAccountingService.CheckBalance(order);
// some code here
AssetManagementService.ChangeAssetCount(order);
// some code here
}
Ciò significa che se aggiungiamo un altro sottosistema (modulo) che deve fare qualcosa in ordine, dobbiamo ricompilare il codice del nostro OMS (Order Management System) per supportarlo. Inoltre, in qualche misura siamo accoppiati ad altri sottosistemi, e se uno di essi fallisce, questo processo di registrazione fallisce.
Un modo per rendere questo pezzo di codice dinamico e liberamente accoppiato è utilizzare interfacce o contratti , come:
public void RegisterOrder(Order order)
{
// Finding a list of all IOrderProcessors.
// Looping over each, calling orderProcessor.Process(order);
}
Tuttavia, ha due problemi:
- Non possiamo usare le interfacce su SOAP e HTTP (non abbiamo accesso ai file DLL di altri sottosistemi)
- Questi devono essere eseguiti in un ordine specifico (il motore delle regole è il primo)
Cosa dovremmo fare qui? Quali sono i modelli e le pratiche conosciuti?