6

Ho una domanda sul controllo dell'unicità in DDD. So già alcune domande su StackOverflow, ma in realtà non rispondono ai miei dubbiconvalida univoca in DDD

È possibile che una radice aggregata contenga il riferimento del repository per verificare l'unicità durante l'aggiornamento/l'inserimento nel database? O questo è il compito svolto dal servizio applicativo al posto del modello di dominio?

Diciamo che voglio verificare se il nome utente del modello User è unico quando il registro utente Ci sono diversi approcci che mi viene in mente:

  • utente UserRepository modello di riferimento, fare il controllo unicità validate()
  • creare un servizio di dominio per un controllo unicità, utilizzando UserRepository (questo sembra un po 'strano per me, perché penso che di solito servizio di dominio viene utilizzato solo nel caso in cui la durata della logica a più di un modelli di dominio)
  • Creare un oggetto specifica nel livello dominio, con riferimento a Usa rRepository per incapsulare regola di controllo unico, e l'uso di applicazione livello di servizio questo per fare la verifica prima di aggiornamento/inserimento

E se uso Dependency Injection, sto ancora chiedendo su come iniettare UserRepository in uso nel metodo 1, o servizio di dominio nell'approccio 2, o servizio applicativo nell'approccio 3, perché in ogni caso, per l'oggetto/servizio dominio/oggetto della specifica, ho bisogno di istanziare l'oggetto manualmente, quindi l'unica opzione che ho sembra di usare il localizzatore di servizio in IoC per ottenere istanza. Ma il servizio di localizzazione è un anti-modello quindi voglio evitarlo

Ogni codice di esempio sarà molto apprezzato

+2

Direi che dovresti implementarlo nel livello di servizio. Per essere più specifici, definire una classe di validatori per un tipo specifico di business logic (il comando) e gestire la convalida in un decoratore che si avvolge attorno alla classe di servizio. – Steven

+0

Sarebbe utile? http://stackoverflow.com/a/11958251/625332 – Dmitry

+0

@Steven quindi dovrei creare un UserValidator per implementare il controllo per Utente nel livello di servizio? Si considera la perdita della regola aziendale (unicità del nome utente) all'esterno del livello dominio? –

risposta

4

Penso che il controllo di unicità cade in responsabilità Repository. Il repository conosce tutti gli aggregati perché suppone di simulare la raccolta di domini, quindi è naturale chiedere al Repository l'unicità (come ci si aspetterebbe ad esempio da HashMap).

// repository 
interface Users { 
    // implementation executes SQL COUNT in case of relation DB 
    bool IsNameUnique(String name); 

    // implementation will call IsNameUnique and throw if it fails 
    void Add(User user); 
} 

È un'astrazione che perde in un senso, perché in un ambiente multiutente questo bisogno di essere eseguita su un lato archivio dati (vincolo UNIQUE SQL per esempio, o chiusura).

IsNameUnique probabilmente non dovrebbe essere chiamato da aggregato utente, vorrei spostare questa chiamata in applicazione o servizio Domain, a seconda di come resto della vostra applicazione è strutturata.

Vedere Uniqueness validation in CQRS Architecture per approccio alternativo.

+0

quindi stai suggerendo di seguire l'approccio 2 sopra, per creare un servizio di dominio per chiamare il repository per verificare l'unicità? È un modo comune in DDD creare un servizio di validazione nel livello di dominio come quello? Sono nuovo di DDD quindi non molto sicuro –

+0

Se utilizzare questo repository dal dominio o dal servizio di applicazione dipende dai casi d'uso, uno va bene finché non si utilizza questo metodo da un aggregato. – Dmitry

+0

grazie, finalmente decido di seguire questo approccio: http: // lostechies.com/jimmybogard/2007/10/24/validazione dell'entità-con-visitatori-e-metodi-estensioni/ –