Я нахожусь в середине "дискуссии" с коллегой о лучшем способе реализации уровня данных в новом приложении.
Одна из точек зрения заключается в том, что уровень данных должен знать бизнес-объекты (наши собственные классы, представляющие сущность) и уметь работать с этими объектами нативно.
Противоположная точка зрения заключается в том, что уровень данных должен быть объектно-агностическим и работать только с простыми типами данных (строки, bools, даты и т.д.).
Я вижу, что оба подхода могут быть правильными, но моя собственная точка зрения заключается в том, что я предпочитаю первый. Таким образом, если носитель данных меняется, бизнес-слой не должен (обязательно) меняться, чтобы приспособиться к новому слою данных. Поэтому переход от хранилища данных SQL к сериализованному хранилищу файловой системы xml будет простым делом.
Мой коллега придерживается точки зрения, что уровень данных не должен знать об определениях объектов, и что пока данные передаются соответствующим образом, этого достаточно.
Я знаю, что это один из тех вопросов, которые могут привести к религиозной войне, но я буду благодарен за любые отзывы сообщества о том, как вы подходите к таким вещам.
TIA
Это действительно зависит от Вашей точки зрения на мир - я раньше был в недвойном лагере. DAL был только там к данным по запасам к ШАХТЕ - конец истории.
С появляющимися технологиями, такими как Linq к SQL и Структуре Предприятия, становящейся немного более популярной, тогда, грань между DAL и ШАХТОЙ была стерта немного. В L2S особенно Ваш DAL вполне плотно соединен с Деловыми объектами, поскольку у модели объекта есть отображение 1-1 к Вашей области базы данных.
Как что-либо в разработке программного обеспечения нет никакого права, или неправильно ответьте. Вы должны понять свои требования и будущее requirments и работать оттуда. Я больше не использовал бы Феррари на съезде Dakhar, поскольку я буду Рендж Ровер в день следа.
У Вас могут быть оба. Позвольте слою данных не знать о Ваших деловых объектах и сделать его способным к работе больше чем с одним типом источников данных. Если Вы поставляете общий интерфейс (или абстрактный класс) для взаимодействия с данными, у Вас могут быть различные внедрения для каждого типа источника данных. Фабричный образец подходит здесь.
У меня есть отличная книга, которая охватывает эту тему, - Data Access Patterns, автор Клифтон Нок. В ней есть много хороших объяснений и идей о том, как отделить бизнес-слой от слоя персистентности. Вам действительно стоит попробовать. Это одна из моих любимых книг.
В заявлениях, где мы используем NHibernate, ответ становится " где-нибудь в between" в этом, в то время как XML отображение определений (они определяют, какой стол принадлежит, к который объект и какие колонки принадлежат, к который область, и т.д.) находятся ясно в деловом ряду объекта.
Они переданы к универсальному сеансовому администратору данных, который не знает ни об одном из деловых объектов; единственное требование - то, что у деловых объектов, переданных к нему для СВЕРНУВШЕГОСЯ МОЛОКА, должен быть файл отображения.
Один из приемов, который я нашел удобным, заключается в том, чтобы мой слой данных был "агностическим" по отношению к коллекциям. То есть всякий раз, когда я хочу вернуть список объектов из слоя данных, я прошу вызывающую сторону передать список. Поэтому вместо этого:
public IList<Foo> GetFoosById(int id) { ... }
я делаю следующее:
public void GetFoosById(IList<Foo> foos, int id) { ... }
Это позволяет мне передать обычный старый List
Это по-прежнему означает, что мой уровень данных знает об определениях объектов, но это дает мне еще одну дополнительную степень гибкости.
Посмотрите на Linq to SQL, если бы я создавал новое приложение прямо сейчас, я бы подумал о том, чтобы полностью полагаться на слой данных, основанный на Linq.
В остальном я считаю, что хорошей практикой является максимально возможное разделение данных и логики, но это не всегда практично. Чистое разделение логики и доступа к данным затрудняет объединение и оптимизацию, что и делает Linq таким мощным.