Modifica: Questo non è un conflitto a livello teorico ma un conflitto a livello di implementazione.Come posso risolvere il conflitto tra l'accoppiamento lento/l'iniezione di dipendenza e un modello di dominio avanzato?
Un altro Edit: Il problema non è avere modelli di dominio come di soli dati/DTOs contro ricchi, mappa oggetto più complesso, dove Ordine ha OrderItems e una certa logica calculateTotal. Il problema specifico è quando, per esempio, quell'Ordine deve prendere gli ultimi prezzi all'ingrosso dell'OrdineOtem da qualche servizio web in Cina (per esempio). Quindi hai un servizio Spring in esecuzione che consente chiamate a questo servizio PriceQuery in Cina. L'ordine ha calcolare TotalTotal che itera su ogni OrderItem, ottiene il prezzo più recente e lo aggiunge al totale.
Quindi, come faresti a garantire che ogni ordine abbia un riferimento a questo servizio di PriceQuery? Come lo si ripristinerà in caso di serializzazione, caricamento da DB e nuove istanziazioni? Questa è la mia domanda esatta.
Il modo più semplice sarebbe passare un riferimento al metodo calculateTotal, ma cosa succede se il proprio oggetto utilizza questo servizio internamente per tutta la sua durata? Cosa succede se è usato in 10 metodi? Diventa caotico passare i riferimenti in ogni momento.
Un altro modo sarebbe di spostare calcoli fuori dall'Ordine e in OrderService, ma che interrompe il design di OO e ci muoviamo verso il vecchio modo di "Script di transazione".
Original post:
Versione corta: oggetti di dominio Rich richiedono riferimenti a molti componenti, ma questi oggetti vengono persistevano o serializzato, così qualsiasi riferimento tengono ai componenti esterni (fagioli di primavera in questo caso : servizi, repository, qualsiasi cosa) sono transitori e vengono spazzati via. Devono essere reiniettati quando l'oggetto è de-serializzato o caricato dal DB, ma questo è estremamente brutto e non riesco a vedere un modo elegante per farlo.
Versione più lunga: Per un po 'di tempo ho praticato l'accoppiamento libero e il DI con l'aiuto di Spring. Mi ha aiutato molto a mantenere le cose gestibili e verificabili. Qualche tempo fa, tuttavia, ho letto Domain-Driven Design e alcuni Martin Fowler. Di conseguenza, ho cercato di convertire i miei modelli di dominio da semplici DTO (in genere rappresentazioni semplici di una riga di tabella, solo dati senza logica) in un modello di dominio più ricco.
Mentre il mio dominio cresce e assume nuove responsabilità, i miei oggetti dominio stanno iniziando a richiedere alcuni dei bean (servizi, repository, componenti) che ho nel mio contesto Spring. Questo è diventato rapidamente un incubo e una delle parti più difficili della conversione in un design di dominio ricco.
Fondamentalmente ci sono punti in cui sto iniettando manualmente un riferimento al contesto di applicazione nel mio dominio:
- quando l'oggetto viene caricato dal repository o altro ente responsabile in quanto i riferimenti dei componenti sono transitori e, ovviamente, non lo fanno ottenere persistito
- quando oggetto viene creato dalla fabbrica dal momento che un oggetto appena creato manca la componente fa riferimento a
- quando l'oggetto viene de-serializzato in un lavoro al quarzo o in qualche altro luogo in quanto i riferimenti dei componenti transitorie ottenere spazzati
Prima di tutto, è brutto perché sto passando all'oggetto un riferimento al contesto dell'applicazione e mi aspetto che venga estratto dai riferimenti ai componenti necessari. Questa non è iniezione, è tirata diretta.
In secondo luogo, è brutto codice, perché in tutti quei luoghi di cui ho bisogno logica per l'iniezione di un appContext
In terzo luogo, è soggetto ad errori perché devo ricordare per iniettare in tutti quei luoghi per tutti quegli oggetti, che è più difficile di quanto sembri.
Ci deve essere un modo migliore e spero che tu possa far luce su di esso.
quello che stai descrivendo bene, ma mi colpisce pareti su esempi più complessi. Cosa succede se il tuo ordine deve inviare un'e-mail ogni volta che viene calcolato il totale? Certo, potresti portarlo nel tuo Servizio, ma questo non è vero OOP, giusto? Martin F. non usa nemmeno un livello di servizio – rcampbell
Si prega di consultare il mio "Another Edit".Mi piacerebbe davvero sentire i tuoi pensieri – rcampbell