Бизнес-объекты и уровень данных - PullRequest
4 голосов
/ 14 сентября 2010

Этот сайт дал мне много полезных ответов, однако после нескольких часов поиска я не нашел ничего, что бы конкретно отвечало моим потребностям.И так ...

Компания, в которой я работаю, находится в процессе разработки нового уровня бизнес-объектов и уровня доступа к данным - они будут находиться в отдельных сборках.

Проблема в том, что мне трудно разобраться во взаимодействии между этими двумя уровнями - в частности, если DAL знает о BOL, я прочитал множество статей, в которых говорилось, что порядок зависимости должен выглядеть примерно так:

GUI / Presentation -> BOL ---> DAL

Но, насколько я вижу, DAL нужна ссылка на BOL, чтобы иметь возможность "возвращать" объекты вСлой BOL.

Я собираюсь создать промежуточную сборку между BOL и DAL, которая будет в основном тонким слоем, заполненным интерфейсами для разделения этих двух библиотек DLL, поэтому среда может использовать различные DAL, если возникнет такая необходимость.

Это привело меня к идее представить еще один тонкий слой с набором интерфейсов, которые реализует BO, затем, когда BOL вызывает интерфейс DAL, он передает ему объект, который реализует один из этих интерфейсов BO, и затем DAL продолжает работу.заселить объект.Это удаляет все зависимости между BOL и DAL - однако мне трудно оправдаться, если честно.

В идеале мы хотели бы использовать ORM, поскольку это просто устраняет необходимость в написании CRUD-содержимого.но наши клиенты имеют привычку возиться с длинами столбцов в своей базе данных, и это является причиной большинства наших ошибок на сегодняшний день с использованием строго типизированных DataTables.Я слышал, что Linq2SQL также хранит длины столбцов во время компиляции, не уверен, что NHibernate делает или нет (но я не уверен, что наша Схема базы данных разработана достаточно чисто для NHibernate, ловушек работы с унаследованными системами).

Так что да, любое понимание отношений между BOL и DAL было бы очень кстати - извинения, если вышеприведенное написано плохо, если кому-то понадобятся разъяснения, я буду рад предоставить более подробную информацию.

Марлон

Ответы [ 6 ]

3 голосов
/ 14 сентября 2010

То, как я это делаю, это то, что БО ожидает DataReader или DataContext или что-то еще от DAL, а не фактический сформированный объект. Тогда слой BO должен взять и заполнить себя от объекта, который вернулся. DAL не возвращает обратно заполненный BO. Главное, что нужно помнить, это то, что изменение чего-либо на уровне BO не должно вызывать проблем для уровня DAL, но изменение чего-либо на уровне DAL может вызвать проблемы для уровня BO.

Краткий пример того, что я обычно делаю

В слое BO

FillData(){
   DataReader dr = DataLayer.GetData("SomePropertyForAStoreProcedure");
   If dr.Read(){
    Property1 = dr.GetValue("Property1");
    //So on and so forth
   }
}

В DAL

DataReader GetData(String SPProperty){

}
1 голос
/ 27 января 2012

«Правильный» подход будет меняться в зависимости от потребностей бизнеса. Честно говоря, есть много проектов, где я считаю, что наборы записей ado старого стиля затрачивали меньше времени на разработку и их было проще поддерживать, чем многие из ORM сейчас. Уделите некоторое время определению ваших потребностей и помните, что время разработки и ремонтопригодность являются целями проектирования, которые также должны быть должным образом взвешены.

1 голос
/ 14 сентября 2010

DAL нужна ссылка на BOL, чтобы он мог заполнять объекты. То, что вы не хотите иметь, - это какая-либо ссылка или связь от BOL обратно к DAL - это приводит к тому, что ваша BOL будет связана с конкретной реализацией базы данных. Когда вы думаете об этом, это имеет смысл. Ваш DAL знает подробности о бизнес-объектах вплоть до уровня свойств и о том, как извлечь их данные из базы данных - конечно, DAL по своей природе тесно связан с BOL. Таким образом, ссылка на этот путь в порядке. А если подумать, что на другой стороне? База данных. «Тесная связь» между данными вашего объекта и вашей базой данных? Да, это чертовски сложно. Понятие не очень даже значимое.

Это все другое направление, где вам нужно отделиться. Так что да, если нет прямой связи между DAL и BOL, вы можете изменить свою платформу данных в любое время.

Нет особого смысла в создании интерфейсов для BO и передаче их в DAL в этом сценарии. Однако иногда вам может понадобиться пойти другим путем. Как правило, бизнес-объектам не нужно ничего знать о том, как они создаются или сохраняются.

На практике даже с большинством ORM, например, создание бизнес-уровня, полностью свободного от каких-либо постоянных артефактов, может стать очень трудным, а иногда и фактически невозможным. Поэтому иногда у вас есть кое-что, что слишком сложно обойти, хотя, и вы можете обнаружить, что строго избегание знания каких-либо данных в BO ведет к чрезмерной сложности, которая ухудшает, а не увеличивает ценность.

Если вы чувствуете, что нет лучшего способа и вам необходимо что-то сохранить из BOL, создайте простой интерфейс, чтобы функциональные возможности DAL могли быть переданы в BOL. Таким образом, вы по-прежнему можете отделить BOL от конкретной реализации базы данных.

Кроме того, хотя это и дополнительная работа, если это не очень простое одноразовое приложение, я настоятельно рекомендую добавить еще один слой между пользовательским интерфейсом и BOL. Шаблон MVP (Model-View-Presenter) - это шаблон проектирования общего назначения для уменьшения связи между основным приложением и пользовательским интерфейсом. У докладчиков много вариантов, не слишком увлекайтесь конкретными деталями, просто начните с простого MVP, если вы никогда его не использовали.

Шаблоны не так сложны, просто пользовательский интерфейс настолько запутан, что может потребоваться хотя бы пара основных итераций / приложений, прежде чем вы почувствуете, что код, который вы пишете в любое время, работает систематически и методично отделить пользовательский интерфейс. Просто продолжайте работать над этим, начните приобретать арсенал приемов и не зацикливайтесь на том факте, что вы действительно еще не достигли четкого чистого разделения. Все, что вы изучаете и можете сделать, что даже немного способствует созданию четкой границы в пользовательском интерфейсе, является большим шагом в правильном направлении.

1 голос
/ 14 сентября 2010

взгляните на SubSonic http://subsonicproject.com/, он делает большую часть трудоемкой работы по доступу к данным и проще, чем большинство ORMs там

0 голосов
/ 29 января 2012

Это мои выводы,1. Используйте интерфейсы2. Используйте DTO [объекты передачи данных] между DAL и BLL3. Разделить BLL на две части,a. BLL b. Service Layer4. Используйте контейнер Inversion of Control (IoC), чтобы поддерживать соединение как можно ниже.

0 голосов
/ 14 сентября 2010

Это также зависит от того, какую / какую библиотеку / ORM (Object-Relational Mapper) вы используете. При использовании (хорошего) ORM DAL должен быть очень отдаленным, поскольку ORM почти полностью скрыт; однако лучшие практики требуют, чтобы даже тогда, для приложений среднего и большого размера, вы вводили другой слой между BOL и ORM, обычно DTO (объекты передачи данных). DTO также можно использовать без ORM, поскольку они являются просто тупыми объектами, определенными в отдельной библиотеке, и DAL может отвечать за их сохранение (преобразование их из / в структуры базы данных), тогда как BOL может запрашивать DAL и получать их. объекты.

Разделение слоев может быть достигнуто различными способами, чаще всего с помощью интерфейсов и / или MEF или другой структуры DI / IOC. Любая такая техника обеспечивает более чем достаточную развязку при эффективном использовании.

Кроме того, в зависимости от используемой технологии, как сказал Сизиф, один из многоуровневых архитектурных шаблонов поможет красиво разделить задачи: MVC, MVP, MVVM и т. Д. Я лично рекомендую MVVM с WPF (настольный компьютер) или Silverlight (веб), но я Я очень предвзятый - то есть я люблю их обоих до смерти:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...