Niezwracanie DTO w Repozytorium, jak to ugryzc.

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.

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.

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.

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.

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.

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)

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ę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1