@Venesuella
BlackJack и ...

Где должна находиться Domain Model?

Здравствуйте! Разъясните пожалуйста, в каком слое должна находиться Domain Model, в Business Layer или в Data Access Layer?
  • Вопрос задан
  • 337 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Maa-Kut
Полагаю, в Business Layer, т.к. объекты домена - это объекты, моделирующие сущности предметной области; они включают в себя и нужные данные, и соответствующее поведение. В DAL им особо делать нечего, там нужны только данные, подлежащие сохранению.
Ответ написан
Комментировать
Valeriy1991
@Valeriy1991
Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
Добрый день! DomainModel можно располагать и в отдельном слое (это уже шаг в сторону "луковичной" архитектуры (onion). Например, если доменная модель сильно совпадает с моделями в DAL, то имеет смысл расположить ее в отдельном проекте VS, навесить атрибуты Column, Key, ForeignKey, NotMapped (и др. атрибуты из DataAnnotations) - это в случае, если у Вас EF CodeFirst (с EF Database first такое особо не прокатит - только через partial-классы, но, на мой взгляд, это "уродство"), после чего в слое DAL останется только функционал подключения к БД и выполнения запросов. Если доменная модель сильно различается от модели DAL, то можно написать всякие обертки, которые будут преобразовывать классы доменной модели в модели DAL и наоборот.

Я бы советовал доменную модель выносить в отдельный проект. Почему? Потому что так ею проще пользоваться. Иначе Ваш бизнес- или DAL-слой превратится со временем в помойку: там будут и атрибуты, и исключения, да еще в каждом слое свои, и enum, и всякие сервисы/менеджеры/хелперы/... При разбиении решения на проекты, на мой взгляд, также следует придерживаться принципа единственной ответственности (S из SOLID). Каждый проект отвечает за что-то одно. Это позволяет спокойно подключать/отключать функциональности из других проектов (получается что-то вроде модульности решения) и избавляет от циклических зависимостей между проектами (когда у Вас есть проект MyApp.Common, который подключен в MyApp.BLL, но в слое MyApp.BLL есть функционал, который нужно использовать внутри проекта MyApp.Common => получается циклическая зависимость, и способ ее решения - перенести общий функционал в отдельный проект).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы