Modelagem de sistema de calendário usando DDD

Estou aprendendo DDD e modelando um sistema de controle academico para uma universidade como aprendizado. Ainda estou no comeco do sistema e por isso estou fazendo a parte do calendario administrativo. Minha duvida surgiu porque preciso manter uma regra de integridade do calendário. Deixe-me explicar…

Cada calendário possui sempre 3 datas obrigatorias, matricula, substituicao e cancelamento de disciplinas, e varias datas opcionais, como as datas de provas. As datas opcionais podem ser inclusas a qualquer momento no sistema mas as obrigatorias são criadas e injetadas pelo Factory do Calendario. Uma regra de integridade do sistema é que as datas obrigatorias devem ser sempre sequenciais, ou seja: matricula < substituicao < cancelamento. Todas essas datas estao em uma mesma lista.

Minha duvida é, quando devo fazer essa validação? Meu modelo deve estar sempre válido ou só preciso garantir isso no momento de persisti-lo no banco? Se for para manter a integridade dele sempre, como faco a validacao?

Pensei em criar um Policy e injetar no Calendario para validar a lista de datas sempre que o usuario tentar altera-las. Acontece que eu teria q, em um evento, ter conhecimento dos outros eventos para fazer a validacao. É certo isso? Alguma sugestao melhor?

Desculpa se ficou confuso, mas qualquer duvida podem me perguntar…

Se isso é uma regra referente o calendário, deve estar no metodo que altera as datas, que como você disse, está no objeto calendário. De qualquer forma, aqui no forum você vai encontrar as mais variadas opiniões de onde se deve colocar uma validação.

Isso não tem muita relação com Domain Driven Design mas sim com invariantes. Segundo seu texto a condição data1<Data2><Data3 é necessária para que o objeto seja válido logo ela é a invariante dele. Dê uma lida sobre design by contract>

Você poderia garantir essas invariantes através do método de criação da sua entidade em sua factory. Exponha apenas métodos de criação que recebam esses três paramêtros. Dessa maneira, você garante que toda criação da sua entidade vai ser feita utilizando esses paramêtros.

A Factory é ótima para evitar construtores que não garantem a invariante mas lembre-se que quem é responsável por sua invariante é o objeto.