Ho un dominio in cui Organization
ha People
.
Entità organizzazione
public class Organization {
private readonly List<Person> _people = new List<Person>();
public Person CreatePerson(string name) {
var person = new Person(organization, name);
_people.Add(person);
return person;
}
public IEnumerable<Person> People {
get { return _people; }
}
}
Entità persona
public class Person
{
public Person(Organization organization, string name) {
if (organization == null) {
throw new ArgumentNullException("organization");
}
Organization = organization;
Name = name;
}
public Organization { get; private set; }
public Name { get; private set; }
}
La regola per questa relazione è che un Person
deve appartenere esattamente a un Organization
.
Gli invarianti che voglio garantire sono:
-
Una persona deve avere un'organizzazione
- questo viene applicato tramite il costone della persona
-
Un'organizzazione deve conoscere la sua gente
- questo è il motivo per cui l'organizzazione ha un metodo
CreatePerson
- questo è il motivo per cui l'organizzazione ha un metodo
-
Una persona deve appartenere a una sola organizzazione
- questo è il motivo per cui la lista delle persone dell'organizzazione non è mutabile pubblicamente (ignorando il casting su List, forse
ToEnumerable
può applicarlo, non troppo preoccupato però)
- questo è il motivo per cui la lista delle persone dell'organizzazione non è mutabile pubblicamente (ignorando il casting su List, forse
Ciò che voglio è che se una persona viene creata, l'organizzazione ne sa la sua creazione.
Tuttavia, il problema con il modello attualmente è che sei in grado di creare una persona senza mai aggiungerla alla collezione delle organizzazioni.
Ecco un test unitario in errore per descrivere il mio problema
[Test]
public void AnOrganizationMustKnowOfItsPeople()
{
var organization = new Organization();
var person = new Person(organization, "Steve McQueen");
CollectionAssert.Contains(organization.People, person);
}
Qual è il modo più idiomatico per applicare gli invarianti e la relazione circolare?