Разделение проблем-DAO, DTO и BO

Итак, у меня есть 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 ответов


мой единственный источник путаницы здесь-почему вызовы 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);

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

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

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

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

// 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);

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