2012-12-19 10 views
12

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?

+1

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

+0

Metoda GetAll przechodzi przez rekursywnie dzieci i dodaje je do listy. – Moriya

+0

Tylko dla mojej ciekawości: dlaczego upierasz się przy układaniu konstrukcji? Dlaczego repozytorium nie może/nie powinno zwracać struktury podobnej do drzewa? –

Odpowiedz

4

Można napisać metodę przechodzenia przez drzewo i zwracać wartość IEnumerable<T> przy użyciu bloku iteratora (yield return).

wówczas nie musiałby utworzyć „płaski” zbiór zawartości drzewa i można po prostu użyć LINQ to Objects, aby zastosować predykat:

protected virtual IEnumerable<T> Get(Func<T, bool> predicate) 
{ 
    return WalkAll().Where(predicate); 
} 

W rzeczywistości Wouldn zapytań LINQ nawet zostanie oceniony, aż kod klienta go wyliczy.