Разделение интересов - DAO, DTO и BO - PullRequest
7 голосов
/ 19 января 2010

Итак, у меня есть DAO, DTO и 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>());

Итак, я пытаюсь разделить проблемы, но я хочу избавиться от «преобразований» в этом коде.«Преобразователи» фактически находятся на уровне бизнес-логики (уровень DTO ничего не знает о уровне бизнес-логики) как объект расширения.Само DTO, очевидно, только хранит данные и не имеет никакой бизнес-логики.UserRepository вызывает DAO и в конце GetById использует AutoMapper для отображения из DAO в DTO.«Преобразователи» (ToBusiness и ToDataTransfer) делают именно так, как они говорят.

Мой коллега думал, что мне может понадобиться Бизнес-репозиторий, но подумал, что это может быть немного неуклюжим.Есть мысли?

Ответы [ 3 ]

8 голосов
/ 19 января 2010

Мой единственный источник путаницы здесь заключается в том, почему необходимы вызовы ToBusiness<User>() и ToDataTransfer<Data.DTO.User>().

Ответственность Репозитария заключается в управлении данными.Он должен скрывать детали реализации (а также преобразования между бизнес-объектами и объектами данных).

A UserRepository должен возвращать User без какого-либо приведения.

UserRepository также должен быть в состоянии сохранять User без приведения.Код был бы намного чище, если бы все приведение было обработано в репозитории, а ваш код читался как:

UserRepository rep = new UserRepository();

User user = rep.GetById(32);

// Do Work Here

rep.Save(user);
4 голосов
/ 20 января 2010

Я решил эту проблему, создав слой Business Service. Таким образом, я могу получить доступ к функциональности через уровень Business Service, который, в свою очередь, использует репозитории, которые запрашивают DAL и возвращают DTO. DTO служат своей цели, заполняясь DAL, и помогают переносить данные на бизнес-уровень (преобразованный в бизнес-объекты).

Итак, диаграмма выглядит следующим образом:

DAL -> Репозиторий (возвращает DTO) -> Сервис (возвращает BO)

Это работает очень хорошо, и я могу поместить бизнес-логику в слой Service, который абстрагирует ее от самого Repository. Пример кода:

// 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 голос
/ 19 января 2010

Это первый раз, когда я вижу, как DTO преобразуется в BO, я обычно посылаю DTO для использования классом или методом BO. Когда BO сделан и хочет сохранить изменения в DTO, он отправляет его в DAL и сохраняет его.

...