Niezwracanie DTO w Repozytorium, jak to ugryzc.

Niezwracanie DTO w Repozytorium, jak to ugryzc.
  • Rejestracja: dni
  • Ostatnio: dni
0

Czesc czytajac kilka artykulow, jednoznacznie widac, ze repozytorium nie powinien zwracac DTO, a controller powinien sie tym zajmowac. Tutaj sa powody: http://programmingwithmosh.com/entity-framework/common-mistakes-with-the-repository-pattern/. I w sumie sie z tym zgadzam. Ale zalozmy ze mamy taka sytuacje.

Kopiuj
public class SomeEntity
{
  public virtual string SomeProperty {get; set;}
  public virtual string SomeProperty2 {get; set;}
  public virtual SomeEntity2 SomeProperty3 {get; set;}
}

public class SomeEntity2
{
  public virtual string SomeProperty {get; set;}
  public virtual SomeEntity SomeProperty2 {get; set;}
}

public class Repository
{
  // implementacja
  
 public IList<SomeEntity> Get()
 {
 return (
   from e1 in Session.Query<SomeEntity>() 
   let HowMuch = (from e2  in SomeEntity2 where e2.SomeProperty == "a" ).Count() 
   where e1.SomeProperty = "a"
   select new SomeDto {} // to jest wlasnie motyw jak sie tego pozbyc
  ).ToList();
 }
}

Uzywam NHibernate'a jako ORM'a. Niestety pan wyzej podal prosty przyklad ktory a nie wiem jak go zostosowac u siebie. Czy w takim razie SomeEntity powinien miec property HowMuch ? Przyklad troche z d**y, ale nie chce wklejac mojego zapytania, ale idea jest osiagnieta.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
1

Repozytorium jakiegoś typu traktujesz jako kolekcje tego danego typu. Skoro jest to repozytorium SomeEntity to metody dostępne w repozytorium zwracają SomeEntity, a nie jakieś inne obiekty.

  • Rejestracja: dni
  • Ostatnio: dni
0

Nie, bo zwracam per agregat w tej sytuacji. Klasa SomeEntity2 nie ma racji bytu bez SomeEntity. Poza tym, nawet jakbym zrobil tak jak mowisz, to nie rozwiazuje to problemu niestety.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0

To ze masz zwrocic SomeEntity nie oznacza, że SomeEntity nie może mieć w sobie SomeEntity2. Nic takiego nie napisałem. Z repozytorium zwracasz obiekty typu SomeEntity. Potem dopiero na tak zwróconych obiektach operujesz i liczysz sobie to HowMuch itp.

N0
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 767
0

Ja w swojej aplikacji zrobiłem to mniej więcej tak:
SomeEntity - klasa reprezentująca tabelę z której FluentNH robi tabelę
SomeEntityRepository - klasa repozytorium do CRUD na tej tabeli
MyService - klasa serwisu który dostarcza mi takiej funkcjonalności jakiej potrzebuje i w tym serwisie mam na przykład SomeEntityRepository, SomeOtherEntityRepository, pobieram dane, obrabiam je, przygotowuje odpowiedni obiekt i jego zwracam
MyController - klasa kontrolera która korzysta z MyService i jest odpowiedzialna za wyświetlanie widoków (to akurat przykład z asp.net mvc)

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

Przede wszystkim repozytorium nie służy do tworzenia CRUDów bazujących na jakichś anemicznych DTO. Repozytorium zwraca aggerate rooty, które mają swoje encje, które mają swoją logikę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.