Non hai bisogno di un "controller", hai bisogno di un "servizio".
Un Controller controlla il flusso dell'applicazione in base all'input dell'utente e ad altri eventi che si verificano nei livelli inferiori. Un Servizio fa semplicemente in modo ingenuo i suoi affari facendo ciò che è stato detto.
L'oggetto del servizio di migrazione avrebbe l'intelligenza per estrarre i dati dal vecchio schema e persistere nel nuovo schema tramite un servizio Web, se necessario, o un'API completamente diversa. Questo servizio dovrebbe avere la quantità minima di dipendenze per portare a termine il lavoro:
- Classi di modelli di dominio per ogni database
- Classi di accesso ai dati per ogni database
- Metodi o altre classi che associano un modello di dominio a un altro
Il PropertyMigrationService
ha le seguenti responsabilità
- Sapere dove estrarre i dati da
- Sapere dove salvare i dati in
- Avere accesso agli oggetti di mappatura per mappare un modello di dominio a un altro
Avrebbe bisogno di:
-
OldDataAccess
- Una classe per le operazioni CRUD sul vecchio DB
-
Property
- Il modello di dominio per la "proprietà" nel vecchio DB
-
Subdivision
- Modello di dominio per le suddivisioni nel vecchio DB
-
Owner
- Modello di dominio per proprietari nel vecchio DB
-
NewDataAccess
- Una classe per le operazioni CRUD sul nuovo DB / servizio web
-
Address
- Modello di dominio per le proprietà nel nuovo DB
-
Owner
- Modello di dominio per proprietari nel nuovo DB
-
PropertyToAddressMapper
- Mappatura Property
oggetti nel vecchio DB in Address
oggetti per il nuovo DB
-
SubdivisionToAddressMapper
- Mappatura Subdivision
oggetti nel vecchio DB in Address
oggetti per il nuovo DB
-
OwnerToOwnerMapper
: mappa gli oggetti proprietario da un DB all'altro
Finirai con questa gerarchia di oggetti:
-
%codice%
-
PropertyMigrationService
-
OldDataAccess
-
NewDataAccess
-
PropertyToAddressMapper
-
SubdivisionToAddressMapper
Il servizio di migrazione potrebbe avere un unico metodo pubblico chiamato OwnerToOwnerMapper
che esegue la migrazione.
Avendo affrontato schemi legacy, non sai mai in che modo la follia e il caos si incontreranno. Architettando la soluzione in questo modo, in concomitanza con il fatto che le classi di accesso ai dati implementino un'interfaccia e che void migrate()
utilizzi tali oggetti tramite la loro interfaccia, è possibile rendere testabile l'intero processo di migrazione.
Ora puoi lanciare un sacco di test a questo per condizioni di errore note e rendere davvero questa cosa a prova di proiettile (bene, resistente ai proiettili).
Dopo averlo racchiuso in un oggetto servizio, hai una certa flessibilità per quando e dove viene richiamato:
- Da un "controller" in un'applicazione web
- Da uno script avviato come cron job in Linux o in un'attività pianificata in Windows
Il processo di migrazione diventa sia proattivo (l'utente fa clic su un pulsante sulla pagina Web e fa la migrazione) o passivo (un'attività di pianificazione viene eseguita a mezzanotte e fa questi record in gruppi di, ad esempio, 1.000).