Я реализую DAL, используя структуру сущностей.В нашем приложении у нас есть три уровня (DAL, бизнес-уровень и презентация).Это веб-приложение.Когда мы начали внедрять DAL, наша команда думала, что DAL должен иметь классы, методы которых получают ObjectContext, предоставленный сервисами на бизнес-уровне, и работают над ним.Обоснование этого решения заключается в том, что разные ObjectContexts видят разные состояния БД, поэтому некоторые операции могут быть отклонены из-за проблем с соответствием внешних ключей и других несоответствий.
Мы заметили, что создание и распространение контекста объекта из уровня службсоздает высокую связь между слоями.Поэтому мы решили использовать 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)