Я реализую DAL, используя сущность framework. В нашем приложении у нас есть три уровня (DAL, бизнес-уровень и презентация). Это веб-приложение. Когда мы начали внедрять DAL, наша команда считала, что DAL должен иметь классы, методы которых получают ObjectContext, предоставляемые службами на бизнес-уровне, и работают над ним. Обоснованием этого решения является то, что разные объекты ObjectContext видят разные состояния БД, поэтому некоторые операции могут быть отклонены из-за проблем с совпадением внешних ключей и других несоответствий.
Мы заметили, что генерация и распространение объектного контекста с уровня сервиса создает высокую связь между слоями. Поэтому мы решили использовать DTO, сопоставленные Automapper (не неуправляемые объекты или объекты самоконтроля, аргументирующие высокое сцепление, выставление объектов на верхние уровни и низкую эффективность) и UnitOfWork. Итак, вот мои вопросы:
- Это правильный подход к разработке веб-приложения DAL? Почему?
- Если вы ответили "да" на 1., как это примирить концепцию DTO с шаблонами UnitOfWork?
- Если вы ответили "нет" на 1., что может быть правильным подходом к разработке DAL для веб-приложения?
Пожалуйста, если возможно, дайте библиографию, подтверждающую ваш ответ.
О текущем проекте:
Планируется, что приложение будет разработано на трех уровнях: презентация, бизнес и DAL. Бизнес-уровень имеет как фасады, так и сервисы.
Существует интерфейс, называемый ITransaction (только два метода для удаления и сохранения изменений), видимый только в службах. Для управления транзакцией существует класс Transaction, расширяющий ObjectContext и ITransaction. Мы разработали это с учетом того, что на бизнес-уровне мы не хотим, чтобы другие методы ObjectContext были доступны.
В DAL мы создали абстрактный репозиторий, используя два генерических типа (один для объекта, а другой для связанного с ним DTO). Этот репозиторий имеет методы CRUD, реализованные общим образом и два общих метода для сопоставления DTO и сущностей общего репозитория с помощью AutoMapper. Конструктор абстрактного репозитория принимает ITransaction в качестве аргумента и ожидает, что ITransaction будет ObjectContext, чтобы назначить его свой объект ObjectContext.
Конкретные репозитории должны получать и возвращать типы .net и DTO.
Теперь мы сталкиваемся с этой проблемой: генерируемый метод создания не генерирует временный или постоянный идентификатор для присоединенных объектов (пока мы не будем использовать SaveChanges()
, следовательно, нарушая требуемую транзакцию); это означает, что методы обслуживания не могут использовать его для связывания DTO в BL)