Non sono sicuro di come iniziare a spiegare la mia domanda, ma qui va.
Abbiamo appena terminato un'applicazione MVC che colpisce 2 servizi WCF. Ma c'è stato un po 'di disaccordo tra coloro che hanno lavorato al progetto e alcuni che non hanno usato il design. Quello che abbiamo sono due servizi WCF, uno su ciascun sito (dati specifici del sito) e un altro presso la sede centrale (dati condivisi / comuni tra tutti i siti). Normalmente avremmo due app, una per il sito e un'altra per la sede centrale. In questo caso ho deciso da un punto di vista di UX che sarebbe stato meglio averlo come un'app dal punto di vista dell'utente in modo che non avrebbero bisogno di conoscere due URL. Fondamentalmente, l'utente non sa se sta colpendo il sito o la sede centrale.
Ora arriva la decisione progettuale che ha causato i disaccordi. L'app MVC ha controller che devono raggiungere un servizio wcf del sito o un servizio WCF della sede centrale. Pertanto, per evitare che i controller dovessero essere a conoscenza dei due livelli di comunicazione WCF e convertire i risultati WCF in un modello utilizzabile dai controller, ho creato un livello tra i controller e i proxy WCF. Che accetta una richiesta da un controller, quindi chiama il sito appropriato o la chiamata proxy WCF centrale, quindi, se necessario, converte il risultato WCF in un modello che il controller può utilizzare.
Questo strato, ho chiamato un mediatore, ma dopo molte discussioni, sono dell'opinione che non è la descrizione corretta per questo. Ad ogni modo, la ragione di questo livello è quando si cerca di attenersi ai principi orientati agli oggetti di SOILD, in particolare il Principio di Responsabilità Unica. La responsabilità del controller è gestire le richieste dei client e restituire una vista / risultato. Non dovrebbe essere necessario conoscere o gestire un proxy WCF e convertirne il risultato. (Potrebbe andare direttamente a un database invece di una chiamata WCF ma il controller non dovrebbe essere responsabile o nemmeno a conoscenza di ciò perché è responsabile della vista) Lo stesso vale per il proxy WCF, non dovrebbe sapere cosa sta consumando il suo risultato e che il contratto di dati WCF deve essere convertito in un modello specifico per ciascun controllore. Il livello intermedio intermedio è ciò che decide quale servizio WCF e quale metodo chiamare, quindi tramite un metodo di estensione o un gestore specifico converte il risultato in un modello che il controller può utilizzare. (a volte possono essere necessarie diverse chiamate WCF per creare il modello).
Controller1 -> Mediator -> HeadOfficeWCFProxy
Controller2 -> Mediator -> SiteWCFProxy
- Quindi il controller richiede dati (non sapendo da dove proviene)
- Il mediatore converte e passa la richiesta al / ai proxy / i WCF appropriato
- I proxy WCF effettuano le chiamate attraverso il filo e restituiscono i risultati.
- Il mediatore converte quindi i risultati in un modello (se necessario) tramite un metodo di estensione e lo restituisce al controllore.
- Il controller esegue il rendering della vista utilizzando detto modello.
Ora quello che ho descritto qui era solo sul lato MVC. Ho una configurazione simile sul lato del servizio WCF ma i benefici dei mediatori sono più chiari.
Nel servizio WCF della sede centrale
WCFListener -> Mediator -> DataLayer (LinqToSQL)
-> SiteSyncHandler (sends change to all sites asyncronously)
-> ThirdPartyContentManagementHandler (via web service)
Ora gli sviluppatori che hanno lavorato al progetto, come la separazione delle preoccupazioni, dato che è molto chiaro dove tutto appartiene e mantiene il codice al minimo in ogni livello. Ma il lato negativo nell'app MVC è per molte delle chiamate che il mediatore fa semplicemente una singola chiamata WCF e non ha nemmeno bisogno di convertire il risultato (il più delle volte il contratto dati va bene per l'uso come modello) risultante in una discreta quantità di un codice di piastra di caldaia metodo di linea. Il mediatore in realtà non aggiunge molto in questo scenario se non per mantenere le cose coerenti tra i controller. Alcuni sviluppatori che non hanno lavorato al progetto, insistono sul fatto che non vi è alcuna necessità per il livello Mediator e che potrebbe essere gestito interamente dai controllori stessi. Il che significa mantenere il proxy WCF appropriato in ogni controller. Questo nella mia mente viola il principio della responsabilità unica. A loro sostengono che SOLID è più come un insieme di linee guida, e non per essere seguito ciecamente. Che mentre io sono d'accordo con questa affermazione, è anche da non ignorare ciecamente.
Ho ammesso che il termine mediatore non è proprio appropriato (forse regista o staffetta), ma penso ancora che il progetto di base sia valido e lo userei di nuovo. Lo stesso si può dire per coloro che hanno lavorato al progetto. Mi piacerebbe sapere cosa pensano gli altri. C'è una soluzione migliore o ho "complicato". (Ancora non sono d'accordo che è complicato, è un concetto molto semplice e di facile manutenzione)