2010-01-19 13 views
5

Mam więc DAO, DTO i BO. Poniższy kod jest wynikiem:Rozdzielanie obaw - DAO, DTO i BO

// Instantiate a new user repository. 
UserRepository rep = new UserRepository(); 

// Retrieve user by ID (returns DTO) and convert to business object. 
User user = rep.GetById(32).ToBusiness<User>(); 

// Perform business logic. 
user.ResetPassword(); 
user.OtherBusinessLogic("test"); 
user.FirstName = "Bob"; 

// Convert business object back to a DTO to save to the database. 
rep.Save(user.ToDataTransfer<Data.DTO.User>()); 

Więc staram się oddzielić obawy, ale chcę, aby pozbyć się „nawróconych” w tym kodzie. "Przekształcenia" są faktycznie zlokalizowane w warstwie logiki biznesowej (warstwa DTO nic nie wie o warstwie logiki biznesowej) jako obiekt rozszerzenia. DTO sam oczywiście przechowuje dane i nie ma logiki biznesowej co-tak-kiedykolwiek. UserRepository wywołuje DAO i na końcu GetById używa AutoMappera do mapowania z DAO do DTO. "Konwertyci" (ToBusiness i ToDataTransfer) robią dokładnie to, co mówią.

Mój współpracownik pomyślał, że może muszę mieć repozytorium biznesowe, ale pomyślałem, że może to być trochę niezgrabne. jakieś pomysły?

Odpowiedz

3

Postanowiłem to tworząc warstwę usługi biznesowe. W ten sposób mogę uzyskać dostęp do funkcji za pośrednictwem warstwy usługi biznesowej, która z kolei korzysta z repozytoriów, które wysyłają zapytania do DAL i zwracają DTO. DTO spełniają swoje zadanie, wypełniając je przez DAL i pomagają przenieść dane do warstwy biznesowej (przekonwertowane na obiekty biznesowe).

więc schemat jest następujący:

DAL -> Repository (zwraca dto) -> Usługi (zwraca BO)

To działa bardzo dobrze i jestem w stanie umieścić logiki biznesowej w warstwie usług który usuwa go z samego repozytorium. Przykładowy kod:

// UserService uses UserRepository internally + any additional business logic. 
var service = new UserService(); 
var user = service.GetById(32); 

user.ResetPassword(); 
user.OtherBusinessLogic("test"); 
user.FirstName = "Bob"; 

service.Save(user); 
1

Jest to pierwszy raz widzę DTO przekształca się w BO, ja normalnie wysłać DTO być spożywane przez klasę BO lub metody. Kiedy BO jest gotowe i chce zapisać modyfikacje DTO, wysyła je do DAL i utrzymuje.

+0

Dzięki za odpowiedź. Pomocny mógłby być dowolny przykładowy kod, który mógłbyś podać. –

+0

Zgadzam się z tym. Powinieneś odzyskać swój obiekt biznesowy i jeśli chcesz przekonwertować go na DTO, konwersja może nastąpić za pomocą narzędzia takiego jak AutoMapper. –

8

Moje jedyne źródło nieporozumień tutaj, dlatego, że połączenia z ToBusiness<User>() i ToDataTransfer<Data.DTO.User>() są konieczne.

Odpowiedzialność repozytorium polega na zarządzaniu danymi. Powinien ukrywać szczegóły implementacji (a także konwersje między obiektami biznesowymi i obiektami danych).

A UserRepository powinien zwrócić wartość User bez konieczności stosowania rzutowania.

Urządzenie UserRepository powinno również być w stanie utrzymywać wartość User bez rzutowania.

Kod byłoby znacznie czystsze jeśli cały odlew był obsługiwany w repozytorium i kod odczytać jako:

UserRepository rep = new UserRepository(); 

User user = rep.GetById(32); 

// Do Work Here 

rep.Save(user); 
+1

Proponujesz nie posiadanie obiektu DTO i pomijanie prawa do obiektu biznesowego? re: Kod Cleaner - Całkowicie się zgadzam - staram się wykorzystać ten rozdział obaw. –

+0

Popraw mnie, jeśli się mylę tutaj Justin, ale nie sądzę, że Justin proponuje nie posiadanie DTO, ale raczej sugeruje, aby to ukryć.Repozytorium nazwałoby metody konwersji między DTO i BO, tak aby podczas programowania normalnej funkcjonalności biznesowej nigdy nie musiałbyś widzieć ani wiedzieć o DTO. – rayd09