DDD con entità senza relazioni

0

Disclaimer: non sono sicuro al 100% di aver compreso alcune pratiche e concetti in DDD, quindi a questa domanda potrebbe essere data una risposta chiarendo le idee

Sto lavorando in un sistema legacy (scritto in PHP) in cui lo strumento database non fornisce alcuna mappatura relazionale dell'oggetto e quindi gli oggetti che escono dallo strato di accesso al database tendono ad essere, più o meno, specchi delle righe restituite dalla query.

Per i moduli più recenti, sto cercando di applicare DDD. Tuttavia, sto lottando con come costruire un modello di dominio ricco quando le mie entità non hanno relazioni. Prendiamo ad esempio il seguente requisito: users can see the messages they have previously accepted , dove un messaggio che viene accettato è, internamente, registrato da una singola nuova riga in una tabella di database.

Se usavo un ORM e le mie entità avevano relazioni, potrei scrivere qualcosa di simile a $user->getAcceptedMessages() , che restituirebbe una raccolta di entità messaggio. Tuttavia, dal momento che non ho questo, sono diviso tra due approcci:

  1. Popolare le relazioni come parte della costruzione dell'entità nel repository. Le query potrebbero diventare grandi, ingombranti e difficili da gestire man mano che il numero di relazioni aumenta e lo schema cambia.
  2. Crea servizi per azioni come questa, che dipendono dal repository e da un utente, ad esempio UserMessageAcceptanceService . Tuttavia, sospetto che ciò potrebbe portare a un modello di dominio anemico.

O l'approccio è ragionevole in questo scenario? O una qualche forma di ORM è un requisito per applicare in modo efficace DDD?

    
posta Andy Hunt 26.06.2014 - 10:23
fonte

1 risposta

1

DDD riguarda la modellazione dei casi aziendali. Non ha nulla a che fare con il modo in cui le entità e le relazioni vengono mantenute. DDD è stato effettivamente concepito in tempo quando ORM non era molto usato e quando leggi il libro originale DDD, noterai che parlano molto dell'uso di SQL puro per la persistenza. Ecco perché esistono repository in DDD. Solo perché non persistono le relazioni in DB non significa che le tue entità non le abbiano. Loro fanno.

Nel tuo caso, entrambe le soluzioni sono possibili. In realtà utilizzare entrambi in un singolo progetto è il modo migliore, perché entrambi hanno i suoi vantaggi e svantaggi. Nel secondo caso, sarebbe meglio se tale metodo fosse parte del repository stesso. Non è necessario creare un servizio specifico. Terza opzione sarebbe quella di utilizzare un comportamento simile a caricamento lento nel metodo getAcceptedMessages e caricare i dati solo su richiesta. Ma dovresti fare attenzione con questo.

    
risposta data 26.06.2014 - 12:12
fonte

Leggi altre domande sui tag