Mi chiedevo quale delle seguenti affermazioni sia considerata una best practice quando si tratta di relazioni parent parent.Progetto basato su domini - Modello di relazione figlio genitore - Modello di specifica
1) Il seguente esempio sembra essere una pratica comune, ma quando si crea un'istanza di un bambino, esso si troverà in uno stato non valido purché non venga aggiunto al genitore. Non potrebbe questo portare a problemi per quanto riguarda la convalida ecc
public class Parent
{
private ICollection<Child> children;
public ReadOnlyCollection Children { get; }
public void AddChild(Child child)
{
child.Parent = this;
children.Add(child);
}
}
public class Child
{
internal Parent Parent
{
get;
set;
}
public Child()
{
}
}
2) Il campione successivo sarebbe fare in modo che un bambino deve sempre essere legata al suo genitore.
public class Parent
{
private ICollection<Child> children;
public ReadOnlyCollection Children { get; }
public Child CreateChild()
{
var child = new Child();
child.Parent = this;
children.Add(child);
return child;
}
}
public class Child
{
internal Parent Parent
{
get;
set;
}
internal Child()
{
}
}
3) Nell'ultimo esempio quel bambino si occupa della relazione alla sua madre stessa.
public class Parent
{
private ICollection<Child> children;
public ReadOnlyCollection Children { get; }
public void AddChild(Child child)
{
child.Parent = this;
children.Add(child);
}
}
public class Child
{
public Parent Parent
{
get;
set;
}
public Child(Parent parent)
{
this.Parent = parent;
}
}
Quale modello è considerato il migliore? Credo che il modello 2 potrebbe essere il migliore da allora un bambino non può mai esistere senza una relazione con il suo genitore. Ciò renderebbe più semplice, ad es. in sede di attuazione di un modello specifica che potrebbe fare cose come:
public class ChildSpecification
{
bool IsSatisfiedBy(Child child)
{
return child.Parent.Children.Where(someCondition).Count > 0;
}
}
La specifica di cui sopra può funzionare solo se un bambino ha un genitore.
Cosa ne pensi? Conosci modi migliori? Grazie in anticipo
Il modello di specifica riguarda un caso speciale che sto attualmente svolgendo in uno dei miei progetti. Un bambino ha un intervallo di date di validità, che non dovrebbe intersecarsi con altri intervalli di date di validità di qualsiasi altro bambino all'interno della raccolta secondaria. Lo considereresti una specifica per il genitore? – Chris
Probabilmente lo implementerei come condizione di guardia nel metodo addChild() del Parent. Il genitore quindi non consentirebbe l'aggiunta per es. lanciando un'eccezione. Probabilmente non userò una specifica in questo caso. – alasdairg
Ma ho bisogno di controllare anche quello sull'interfaccia utente. Quindi, quando viene lanciata un'eccezione, dovrei prenderlo. Anche questo non è molto elegante. Inoltre, il bello delle specifiche è che potrei usarlo in molti scenari diversi come 1.) all'interno del mio dominio oe 2.) all'interno di un'applicazione client per pre-validare la logica di business. O mi sbaglio? – Chris