Ich habe zwei Datensammlungen in zwei verschiedenen Modellen, die eine Repository-Schnittstelle implementieren. Einer von ihnen ist in einer flachen Liste, die gut mit dem Repository-Modell passt. Das andere Datenmodell ist in einer Baumstruktur formatiert und die Implementierung der Repository-Schnittstelle, die ich gebaut habe, sieht sehr schattig aus. Ich könnte versuchen, das zweite Datenmodell zu verflachen und nur Verweise auf Eltern zu verwenden, aber momentan hat die Anwendung einige große Vorteile, weil ich die Daten als Baumstruktur bekommen kann.Repository Muster Implementierung mit Datenmodell in einer Baumstruktur
Was würde ich gerne wissen, wenn jemand Erfahrung mit der Implementierung eines Repository-Muster mit einem Baum strukturierten Datenmodell hat. Derzeit in meiner Get(Func<T, bool> predicate)
Methode flachte ich die Liste mit einer rekursiven Methode und das Objekt mit einer LINQ-Abfrage zurück, aber ich fühle mich wie diese Implementierung ist ein bisschen zu teuer.
Alle Tipps, wie dies zu implementieren wäre geschätzt.
Hier ist die Implementierung der Get-by-Prädikat-Methode, wenn das hilft, die Sillines der Implementierung zu veranschaulichen.
protected virtual IEnumerable<T> Get(Func<T, bool> predicate)
{
var objects = GetAll<T>();
return objects.Where(predicate);
}
EDIT: einige mehr Code
private IEnumerable<TreeData> GetRecursiveObjects(TreeData object)
{
var allChildren = new List<TreeData>();
allChildren.AddRange(object.Children);
foreach (var child in object.Children)
{
allChildren.AddRange(GetRecursiveObjects(child).ToArray());
}
return allChildren;
}
protected virtual IEnumerable<T> GetAll<T>()
{
var objects = new List<T>();
objects.AddRange(Objects);
foreach (var object in Objects)
{
objects.AddRange(GetRecursiveObjects(object));
}
return objects.OfType<T>();
}
Zweite edit:
ich auch ein wenig verwirrt bin, was für eine gute Strategie-Elemente in das Repository Hinzufügen wäre. Sollte ich mit dem Hinzufügen von Children des übergeordneten Elements im using-Code umgehen oder sollte das Repository sowohl das Element als auch einen Verweis zum übergeordneten Element nehmen und die gesamte add-Operation behandeln?
tl; dr
Ist es verrückt zu versuchen, eine Repository-Schnittstelle mit Daten in einer Baumstruktur zu implementieren?
Die Antwort auf Ihre Frage hängt wirklich von der Struktur Ihres Baumes ab und davon, wie Sie Ihre Daten tatsächlich nachschlagen. Könnten Sie ein wenig mehr Details liefern? – James
Die GetAll-Methode durchläuft rekursiv die untergeordneten Elemente und fügt sie zu einer Liste hinzu. – Moriya
Nur für meine Neugier: Warum bestehen Sie darauf, die Struktur zu glätten? Warum kann/soll das Repository keine baumartige Struktur zurückgeben? –