Я посреди "обсуждения" с коллегой о лучшем способе реализовать слой данных в новом приложении.
Одна точка зрения состоит в том, что слой данных должен знать о бизнес-объектах (наши собственные классы, которые представляют объект), и быть в состоянии работать с тем объектом исходно.
Противостоящая точка зрения состоит в том, что слой данных должен быть объектным агностиком и просто обработать простые типы данных (строки, bools, даты, и т.д.)
Я вижу, что оба подхода могут быть допустимыми, но моя собственная точка зрения состоит в том, что я предпочитаю первого. Тот путь, если носитель данных изменяется, бизнес-слой, должен не (обязательно) измениться для размещения нового слоя данных. Это поэтому была бы тривиальная вещь измениться от хранилища данных SQL до сериализированного xml хранилища файловой системы.
Точка зрения моего коллеги - то, что слою данных не придется знать об определениях объектов, и что, пока данные передаются о соответственно, который является достаточно.
Теперь, я знаю, что это - один из тех вопросов, который имеет потенциал для запуска религиозной войны, но я ценил бы любую обратную связь от сообщества о том, как Вы приближаетесь к таким вещам.
TIA
Это действительно зависит от Вашего представления мира - я раньше был в разъединенном лагере. DAL был только там к данным по запасам к BAL - конец истории.
С появляющимися технологиями, такими как Linq к SQL и Платформе Объекта, становящейся немного более популярной, затем, грань между DAL и BAL была стерта немного. В L2S особенно Ваш DAL вполне сильно связывается к Бизнес-объектам, поскольку объектная модель имеет отображение 1-1 на Ваше поле базы данных.
Как что-либо в разработке программного обеспечения нет никакого права, или неправильно ответьте. Необходимо понять требования и будущее requirments и работать оттуда. Я больше не использовал бы Феррари на съезде Dakhar, поскольку я буду Рендж Ровер в день дорожки.
Превосходная книга, которую я имею, который затрагивает эту тему, является Шаблонами Доступа к данным Клифтонской Зарубкой. Это имеет много хороших объяснений и хороших идей о том, как отделить Ваш бизнес-слой от слоя персистентности. Действительно необходимо дать ему попытку. Это - одна из моих любимых книг.
У Вас могут быть оба. Позвольте слою данных не знать о Ваших бизнес-объектах и сделать его способным к работе больше чем с одним типом источников данных. При предоставлении единого интерфейса (или абстрактный класс) для взаимодействия с данными у Вас могут быть различные реализации для каждого типа источника данных. Шаблон "фабрика" подходит здесь.
Jeffrey Palermo записал хорошее сообщение об этом. Он назвал это Луковой Архитектурой.
Проверьте Linq к SQL, если бы я создавал новое приложение прямо сейчас, то я рассмотрел бы доверие полностью, Linq основывал слой данных.
Кроме этого я думаю, что это - хорошая практика для отделения данных и логики как можно больше, но это не всегда практично. Чистое разделение между логическим и доступом к данным делает соединения и оптимизации трудными, который является тем, что делает Linq настолько мощным.
Один прием, который я нашел удобными, должен иметь мой слой данных быть "агностиком набора". Таким образом, каждый раз, когда я хочу возвратить список объектов от моего слоя данных, я заставляю вызывающую сторону передавать в списке. Таким образом вместо этого:
public IList<Foo> GetFoosById(int id) { ... }
Я делаю это:
public void GetFoosById(IList<Foo> foos, int id) { ... }
Это позволяет мне передать в простом Списке, если это - все, в чем я нуждаюсь, или более интеллектуальная реализация IList <T> (как ObservableCollection <T>), если я планирую связать с ним от UI. Эта техника также позволяет мне возвратить материал из метода как ValidationResult, содержащий сообщение об ошибке, если один произошел.
Это все еще означает, что мой слой данных знает о моих определениях объектов, но он дает мне одну дополнительную степень гибкости.
В приложениях, где мы используем NHibernate, ответ становится "где-нибудь промежуточным" в этом, в то время как XML отображающиеся определения (они указывают, какая таблица принадлежит, к которому объекту и какие столбцы принадлежат, к которому полю, и т.д.), находятся ясно в уровне бизнес-объекта.
Они передаются универсальному менеджеру сеансов данных, который не знает ни об одном из бизнес-объектов; единственное требование - то, что бизнес-объекты, переданные ему для CRUD, должны иметь отображающийся файл.
Старое сообщение, но поиск подобной информации, я столкнулся с этим, которое объясняет это приятно.