Я решил эту проблему, создав слой 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);