Implementuję framework DAL wykorzystujący encje. W naszej aplikacji mamy trzy warstwy (DAL, warstwę biznesową i prezentację). To jest aplikacja internetowa. Kiedy rozpoczęliśmy wdrażanie DAL, nasz zespół uważał, że DAL powinien mieć klasy, których metody otrzymują ObjectContext podany przez usługi w warstwie biznesowej i działają na nim. Uzasadnieniem tej decyzji jest to, że różne ObjectContexts widzą różne stany DB, więc niektóre operacje mogą zostać odrzucone z powodu problemów z dopasowaniem obcych kluczy i innych niespójności.Czy wzór DTO plus UnitOfWork to dobre podejście do projektowania DAL dla aplikacji WWW?
Zauważyliśmy, że generowanie i propagowanie kontekstu obiektów z warstwy usług generuje duże powiązanie między warstwami. Dlatego zdecydowaliśmy się użyć DTO odwzorowanych przez Automapper (nie niezarządzane podmioty lub samo-śledzące podmioty argumentujące o wysokim sprzężeniu, wystawiające jednostki na wyższe warstwy i niską efektywność) i UnitOfWork. Oto moje pytania:
- Czy to jest właściwe podejście do projektowania DAL aplikacji WWW? Czemu?
- Jeśli odpowiedź "tak" na 1., w jaki sposób należy pogodzić koncepcję DTO z wzorcami UnitOfWork?
- Jeśli odpowiedź "nie" na 1., co może być poprawnym podejściem do projektowania DAL dla aplikacji sieci Web?
Proszę, o ile to możliwe, proszę podać bibliografię wspierającą odpowiedź.
o aktualnym wzorem:
Aplikacja została planowanego być opracowane na trzech warstwach: prezentacja, biznesu i DAL. Warstwa biznesowa ma zarówno fasady, jak i usługi.
Istnieje interfejs o nazwie ITransaction (zawierający tylko dwie metody usuwania i zapisywania zmian) widoczny tylko w usługach. Aby zarządzać transakcją, istnieje transakcja klasy rozszerzająca ObjectContext i ITransaction. Zaprojektowaliśmy to mając na uwadze, że w warstwie biznesowej nie chcemy, aby inne metody ObjectContext były dostępne.
W DAL, stworzyliśmy abstrakcyjne repozytorium za pomocą dwóch typów generycznych (jeden dla encji i drugi dla powiązanego DTO). To repozytorium ma metody CRUD zaimplementowane w sposób ogólny i dwie ogólne metody mapowania DTO i jednostek ogólnego repozytorium za pomocą AutoMappera. Konstruktor abstrakcyjnego repozytorium przyjmuje argument ITransaction jako argument i oczekuje, że ITransaction będzie obiektem ObjectContext w celu przypisania go do jego właściwości ObjectContext.
Konkretne repozytoria powinny tylko odbierać i zwracać typy .net i DTO.
Mamy teraz do czynienia z tym problemem: ogólna metoda tworzenia nie generuje tymczasowego lub trwałego identyfikatora dla dołączonych podmiotów (dopóki nie użyjemy SaveChanges()
, a tym samym zerwania transakcji, którą chcemy); to oznacza, że metody serwisowe nie mogą go używać do kojarzenia DTO w BL)
proszę sprawdzić ostatnią wersję pytania ... dzięki! – JPCF
znakomity link ...! – JPCF