mam dwa zbiory danych w dwóch różnych modelach, które implementują interfejs repozytorium. Jeden z nich znajduje się na płaskiej liście, która doskonale pasuje do modelu Repozytorium. Inny model danych jest sformatowany w strukturę drzewa, a implementacja zbudowanego interfejsu repozytorium wygląda bardzo podejrzanie. Mógłbym spróbować spłaszczyć drugi model danych i po prostu użyć odniesień do rodziców, ale obecnie aplikacja ma pewne wielkie korzyści z możliwości uzyskania danych jako struktury drzewa.Repository implementacja wzorca modelu danych w strukturze drzewa
Co chciałbym wiedzieć, czy jest ktoś ma jakieś doświadczenia z wdrożenia repozytorium wzorów o strukturze drzewa modelu danych. Obecnie w mojej metodzie Get(Func<T, bool> predicate)
spłaszczam listę metodą rekursywną i zwracam obiekt za pomocą kwerendy LINQ, ale mam wrażenie, że ta implementacja jest nieco kosztowna.
Wszelkie wskazówki dotyczące sposobu realizacji tego będą mile widziane.
Oto realizacja get metodą kwantyfikatorów, czy to pomaga zilustrować sillines wdrożenia.
protected virtual IEnumerable<T> Get(Func<T, bool> predicate)
{
var objects = GetAll<T>();
return objects.Where(predicate);
}
EDIT: kilka kod
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>();
}
Druga edycja:
Jestem również nieco zdezorientowani, co to dobra strategia na dodawanie elementów do repozytorium będzie. Czy powinienem obsłużyć dodanie elementu potomnego elementu nadrzędnego w kodzie używanym, czy też repozytorium powinno przyjąć element i referencje do elementu nadrzędnego i obsłużyć całą operację dodawania?
tl; dr
Czy to szaleństwo, aby spróbować zaimplementować interfejs z repozytorium danych w strukturze drzewa?
Odpowiedź na twoje pytanie zależy od struktury twojego drzewa i od tego, jak faktycznie wyszukiwałeś dane. Czy możesz podać trochę więcej szczegółów? – James
Metoda GetAll przechodzi przez rekursywnie dzieci i dodaje je do listy. – Moriya
Tylko dla mojej ciekawości: dlaczego upierasz się przy układaniu konstrukcji? Dlaczego repozytorium nie może/nie powinno zwracać struktury podobnej do drzewa? –