... поэтому уровень данных знает, что существует бизнес-уровень
Не совсем правильно, просто известно, что есть пространство имен с именем Business.Entities
, но эти объекты, безусловно, являются листами в архитектуре. Они зависят ни от чего, кроме .Net Framework. Сущности на самом деле не имеют никакой логики (кроме ToString ()), поэтому они просто действуют как контракты данных для всей архитектуры. Также они свободны от ссылок на любые другие проекты. Единственное, что не делает их POCO, это то, что они поддерживают сериализацию.
Как упомянул Бабун, такой подход возможен, и я уверен, что есть примеры, где он работает очень хорошо. И если вы посмотрите на проект и код, то все выглядит так красиво и уютно, что я просто хочу влюбиться в него.
И это будет хорошо и упорядоченно, если вы тщательно спланируете каждое добавление ко всей вашей архитектуре, просмотрите все изменения и будете тесно общаться с разработчиками. Но как только ваша архитектура, база данных и ваши бизнес-процессы будут развиваться более быстрыми темпами, вам придется далеко продвинуться, чтобы смоделировать данные для всех этих слоев с общими объектами. Есть несколько примеров, которые, на мой взгляд, говорят в пользу контрактов на данные уровня. Среди них то, что однажды программист пользовательского интерфейса захочет иметь в ваших объектах уведомления PropertyChanged для своего слоя пользовательского интерфейса. Hrmpf! Вы не можете сделать это, не влияя также на ваш BAL и DAL. В другой день вы сталкиваетесь с тем, что вы хотите, чтобы в объектах хранились свойства только с графическим интерфейсом (например, цвет отображения, положение на экране, состояния выбора и т. Д.). При чем тут база данных? И если вы внимательно посмотрели, то заметили, что у сущностей уже есть специфичные для слоя обработки. Вы видели виртуальные ключевые слова в свойствах навигации? Они существуют для того, чтобы EF мог создавать их подклассы и предоставлять вам прокси-классы с отложенной загрузкой ... которые, в свою очередь, скорее всего не предназначены для передачи через службу.
Альтернативой является использование сопоставления объектов (вручную, с помощью шаблонов или библиотек, таких как AutoMapper). Это решение, конечно, менее чистое, менее удобное, поскольку есть дублирование кода, а также строки и строки кода отображения. Но все это позволяет вам отделить данные в ваших слоях и смоделировать их в соответствии с конкретными потребностями каждого слоя.