Aggregato Repository di confini / progettazione di servizi

0

Sto cercando di applicare DDD alla progettazione di un sistema di gestione delle versioni.

Entità di dominio

  • Project : il progetto / prodotto / sistema.
  • ProjectEnvironment : gli ambienti (Test, Staging, Prod) esistenti per questo progetto. Ogni progetto ha i suoi ambienti definiti.
  • ProjectVersion : una versione specifica del progetto. Questo sarebbe associato a un pacchetto di distribuzione.

Limiteaggregato

DaquestovorreiProjectesserelaradiceaggregataeProjectEnvironmenteProjectVersionessereaggregatidiProject.NessunodiquestipuòesisteresenzaProject.

Repository

AvreiquindisolounProjectRepositorycheforniràProjectspersistentecontuttigliaggregatiProjectVersioneProjectEnvironment(ediconseguenzaèpossibileaccedervisolotramiteilrispettivoProject).

Domande

  1. DovrebbeesserciunVersionRepositoryeunEnvironmentRepository?UnmetodoGetVersionById()suProductRepositorysembrasbagliato.Mapoinonfornirebbepiùrepositorycheminaccianoillimiteaggregato?

  2. Dovrebbeesserciun"ProjectService" che gestirà e convaliderà gli aggregati usando i tre repository? Per salvaguardare da dati non validi, il codice cliente sarebbe solo in grado di fare riferimento al "ProjectService".

posta davenewza 11.12.2013 - 14:37
fonte

1 risposta

1

Se il ProjectVersion non ha senso senza Project , non è necessario disporre di un repository. Tutte le versioni di un progetto dovrebbero essere contenute nel complesso. Inoltre il tuo aggregato stesso è dove dovrebbe avvenire la tua convalida. Ciò garantisce che il tuo aggregato sia sempre coerente e valido.

public class Project {
    private List<ProjectVersion> Versions = new List<ProjectVersion>();

    public void AddVersion(Version version, string notes) {
        if(Versions.Any(x => x.Version > version)) {
            throw new Exception("Invalid version given. Version cannot be lower than the highest current version.");
        }
        Versions.Add(new ProjectVersion(this, version, notes));
    }
}
    
risposta data 11.12.2013 - 18:31
fonte