DDD: salvataggio delle modifiche dall'interfaccia utente all'oggetto dominio

0

In molti casi, ci sono diversi tipi di moduli nell'interfaccia utente di un'applicazione, e queste forme sono utilizzate per raccogliere tutti i dati necessari per aggiornare (o creare naturalmente) oggetti di dominio (es. applicazione).

Quando i dati dell'intera persona Person vengono trasferiti come DTO per il back-end di softaware, quindi come salvare le modifiche in modo DDD? Ho letto diversi post sul blog, in cui viene guidato che ogni singolo modo per modificare o correggere i dati, deve essere gestito come una propria operazione aziendale, come changeAddress () o amplifyDescription (). Ma ora ho tutti i cambiamenti in un oggetto DTO, quindi quali sono i prossimi? Posso prendere in considerazione il DTO come un insieme di operazioni commerciali e ora devo solo trasformare quei "comandi" in chiamate di operazioni commerciali reali? Il fatto è che è abbastanza normale che ci siano molte operazioni messe insieme nelle interfacce utente e, in qualche modo, devo gestirle nel backend.

Penso che mappare i dtos agli oggetti del dominio usando un qualche tipo di automapper o a mano, sia un modo sbagliato e anemico per far funzionare le cose, e consisterebbe in un codice generoso e privo di significato.

    
posta Toni 09.02.2016 - 10:49
fonte

3 risposte

4

Potresti dare un'occhiata al concetto di UI basata sulle attività .

Sotto questo paradigma, non solo i livelli back-end riflettono i tuoi processi di dominio, ma anche il front-end è costruito tenendo in mente l'obiettivo aziendale finale dell'utente finale. Potrebbe non esserci una mappatura 1-a-1 tra le attività dell'utente e le operazioni di dominio il 100% delle volte, ma questo è in ogni caso un grande aiuto per costringerti a pensare al di fuori del riquadro CRUD anche a livello di interfaccia utente.

    
risposta data 09.02.2016 - 14:08
fonte
1

Questo non è molto diverso da ciò che si otterrebbe in un'applicazione web: una grande forma che è logicamente suddivisa potrebbe essere inviata al server in una volta sola, in modo da ottenere tutti i dati in un singolo "DTO" ( la richiesta stessa). Il modo migliore per farlo è dividere i dati dal DTO in comandi che hanno un raggruppamento logico dei dati. Ad esempio, supponiamo che il tuo schermo abbia sia l'indirizzo di una persona, che le informazioni sui rimborsi del conto bancario debbano andare a E le informazioni di contatto alternative. Il tuo DTO conterrà tutte queste informazioni.

Il codice che ottiene questo DTO ora deve trasformarlo in "comandi" da inviare al dominio. Questi 'comandi' avranno un raggruppamento logico dei tuoi dati. Il comando da inviare al tuo dominio per modificare l'indirizzo conterrà solo le informazioni utili per quel comando (via e numero, codice postale, città, ecc ...) Il comando per cambiare le informazioni di rimborso richiederà solo che tu invii quello informazione. A tale riguardo, il dominio non sa (e non si preoccupa) dell'interfaccia utente. Si preoccupa solo di ricevere tutte le informazioni necessarie per eseguire le azioni richieste.

Ora, probabilmente dovresti pensare anche all'interfaccia utente dell'applicazione in generale. Se stai applicando DDD, pensa alla tua interfaccia utente con gli occhiali DDD. Ha davvero senso avere un grande schermo in cui un utente può cambiare tutto? O è meglio che l'interfaccia utente rifletta un po 'di più il mondo reale, in cui un utente "cambia indirizzo" perché viene spostato o "cambia informazioni di rimborso" perché ha cambiato banca?

    
risposta data 09.02.2016 - 14:12
fonte
-2

Il modo in cui descrivi i cambiamenti come operazioni aziendali viene spesso utilizzato con il sourcing di eventi, ma ovviamente non è necessario fare il sourcing di eventi per seguire il consiglio. La domanda quindi è perché vuoi usarla - hai intenzione di memorizzare una pista di controllo? O semplicemente non ti piace l'approccio Object- > DTO- > DB e preferiresti l'oggetto Changed- > [operations] - > DB?

La mia esperienza con questo concetto è che mentre suona molto bello e pulito, in pratica è davvero difficile da fare in modo significativo.

  1. O hai bisogno di un'intera serie di "pulsanti di modifica" (potresti organizzare il tuo ui leggermente diverso e nominare le cose in un altro modo, ma il concetto è lo stesso) per tutti i tipi di modi in cui potresti cambiare i dati. Per qualcosa di diverso dal più piccolo oggetto, non lo farai bene. Se fai questo, quindi salva la sequenza di operazioni (possibilmente compressa)
  2. O è necessario indovinare quale modifica è stata apportata e ciò non funzionerà se si desidera mapparlo alle operazioni aziendali. L'indirizzo è cambiato a causa di errori di ortografia o di spostamento della persona?

Ora, per me, questo significa che il tipo di interfaccia più comune, vale a dire "Voglio cambiare qualsiasi valore per questo oggetto", è una cattiva idea. L'unica cosa che puoi estrarre è il diff di due oggetti. Questo è ingombrante nella maggior parte delle lingue OO, ma può essere fatto.

Un suggerimento se segui quel percorso, sarebbe usare il modo in cui svn o git lo fa. Tieni traccia della versione con cui l'utente ha iniziato a lavorare, controlla quale versione è al momento del commit e poi confronta questi con la versione modificata. Se l'utente non è aggiornato, hai più opzioni; interrompere il commit o consentire il commit a determinate condizioni (deve essere scelto con l'esperto di dominio).

Quindi prendi il diff minimo e usalo; applicarlo nel database, memorizzarlo nel registro di controllo. (Questo è, naturalmente, approssimativamente ciò che gli ORM stanno facendo sull'oggetto originale.) Si ottiene un log riproducibile (in teoria), non si ha a che fare con un ampio set di operazioni e non si costringe gli utenti a usare estranei interfacce utente.

(Personalmente ho iniziato ad abbandonare le "tecniche DDD" per un approccio più orientato ai dati / valore. L'onere e la rigidità delle "tecniche DDD pure" appesantisce gran parte del codice, spesso con scarso guadagno oltre alla sensazione di fare qualcosa di giusto, dico "tecniche DDD", DDD come idea progettuale agnostica è ancora buona.)

    
risposta data 09.02.2016 - 13:44
fonte

Leggi altre domande sui tag