Ho iniziato a pensare a tenere traccia delle modifiche nel grafico di oggetti complessi in un'applicazione disconnessa. Ho già trovato diverse soluzioni, ma vorrei sapere se esiste qualche pratica migliore o quale soluzione utilizzi e perché? Ho passato la stessa domanda a MSDN forum ma ho ricevuto solo una risposta. Mi piacerebbe avere più risposte per imparare dall'esperienza di altri sviluppatori.Tracciamento delle modifiche nel grafico di oggetti complessi
Questa domanda è correlata a .NET, quindi per le risposte con dettagli di implementazione preferisco le risposte relative al mondo .NET ma penso che questo sia lo stesso su altre piattaforme.
Il problema teorico nel mio caso è definita in multi architettura a strati (non necessariamente n livelli al momento) come segue:
- Strato di repository utilizzando ORM per affrontare persistenza (ORM no al momento, ma probabilmente sarà Entity Framework 4.0 o NHibernate).
- Insieme di classi pure (persistente ignorante = POCO che equivale a POJO nel mondo Java) che rappresenta gli oggetti del dominio. I repository persistono in quelle classi e le restituiscono come risultati di query.
- Insieme di servizi di dominio che funzionano con entità di dominio.
- Livello facciata che definisce il gateway per la business logic. Internamente utilizza repository, servizi di dominio e oggetti di dominio. Gli oggetti di dominio non sono esposti - ogni metodo di facciata utilizza set di oggetti di trasferimento dati specializzati per parametro e valore di ritorno. È responsabilità di ciascun metodo di facciata trasformare l'entità del dominio in DTO e viceversa.
- Applicazione Web moderna che utilizza il layer di facciata e DTO: io chiamo questa applicazione disconnessa. In generale, la progettazione può cambiare in futuro, in modo che il livello di facciata venga spostato dal livello del servizio Web e l'applicazione Web consumerà i servizi => passaggio a 3 livelli (Web, business logic, database).
Supponiamo ora che uno degli oggetti del dominio sia Ordine con dettagli dell'ordine (righe) e Ordini correlati. Quando il cliente richiede l'ordine per la modifica, può modificare l'ordine, aggiungere, rimuovere o modificare i dettagli dell'ordine e aggiungere o rimuovere gli ordini correlati. Tutte queste modifiche vengono eseguite sui dati nel browser Web: javascript e AJAX. Quindi tutte le modifiche vengono inviate in un'unica ripresa quando il client preme il pulsante Salva. La domanda è come gestire questi cambiamenti? Lo strumento Deposito e ORM deve sapere quali entità e relazioni sono state modificate, inserite o eliminate. Ho terminato con due soluzioni "migliori":
Memorizza lo stato iniziale del DTO in campo nascosto (in caso contrario alla sessione). Quando si riceve una richiesta di salvataggio delle modifiche, creare un nuovo DTO basato sui dati ricevuti e sul secondo DTO basato sui dati persistenti. Unisci questi due e tiene traccia delle modifiche. Invia DTO unito al layer facciata e utilizza le informazioni ricevute sulle modifiche per impostare correttamente il grafico delle entità. Ciò richiede del tracciamento manuale delle modifiche nell'oggetto dominio, in modo che le informazioni sulle modifiche possano essere configurate da zero e successivamente trasferite al repository. Questo è il punto di cui non sono molto soddisfatto.
Non tenere traccia delle modifiche nel DTO. Quando si ricevono i dati modificati nel livello facciata creare entità modificate e caricare lo stato effettivo dal repository (in genere query aggiuntiva al database - questo è il punto che non sono molto soddisfatto) - unire queste due entità e tenere traccia automaticamente delle modifiche per proxy di entità fornito dallo strumento ORM (Entity framework 4.0 e NHibernate lo consentono). È necessaria particolare attenzione per la gestione della concorrenza perché lo stato effettivo non deve essere lo stato iniziale.
Cosa ne pensi?Che cosa mi consiglia?
So che alcune di queste sfide possono essere evitate utilizzando la memorizzazione nella cache su alcuni livelli dell'applicazione, ma è qualcosa che non voglio utilizzare al momento.
Il mio interesse per questo argomento va ancora oltre. Ad esempio, supponiamo che l'applicazione vada all'architettura a 3 livelli e il client (l'applicazione web) non verrà scritto in .NET = Le classi DTO non possono essere riutilizzate. Monitorare i cambiamenti su DTO sarà molto più difficile perché richiederà ad altri team di sviluppo di implementare correttamente il meccanismo di tracciamento nei loro strumenti di sviluppo.
Credo che questi problemi debbano essere risolti in molte applicazioni, per favore condividi la tua esperienza.
Ciao, grazie per la risposta molto buona. Mi piace. È molto vicino alla mia architettura, tranne che nel mio caso sto usando DTO tra UI e BL e oggetti/entità di dominio tra BL e DAL. Comprendo la tua spiegazione, l'unico punto che mi manca è la risposta alla domanda principale: come tenere traccia dei cambiamenti nel grafico di oggetti complessi? Ricevi DTO e devi in qualche modo scoprire cosa è cambiato. Se il DTO è un oggetto semplice, non è necessario tracciarlo, ma per quanto riguarda DTO che contiene una raccolta di altri DTO? Devi sapere cosa è cambiato in quella raccolta. –
RE cambiamenti nell'oggetto Grafico - Mi aspetto Ci sono schemi di progettazione che gestiranno questo, ma non riesco a ricordare nessuno in cima alla mia testa - mi viene in mente Momento, altrimenti forse un modello guidato dagli eventi? –
Nel modello ASP.NET tradizionale, le pagine tendono a essere create da zero ogni volta (e quindi si sta caricando in tutti i dati indipendentemente da cosa è cambiato), e se si stanno persistendo i dati nel viewstate si tende a trattarli come "i dati" - quindi non sono stato nella posizione di voler cercare cambiamenti specifici nel modo che stai suggerendo (?). L'altro approccio è basato su AJAX, ma questo è simile.Il modello di osservatore potrebbe anche essere di interesse. –