Передача данных в более старое приложение
Как вы передаете данные слоям в многоуровневом приложении? Я наметил 3 разных метода.
А) универсальные.net-объекты, универсальные таблицы данных, хэш-таблицы, универсальные наборы данных, строки, целые и т. Д., А затем использование наборов данных для заполнения ваших бизнес-объектов, которые отправляются на уровень пользовательского интерфейса.
http://img11.imageshack.us/img11/460/generic.png
http://dabbleboard.com/draw?b=eiu165&i=26&c=54eef6f1ac01f03c85919518f4a24e798e57e133
Pro - дополнительные слои не требуются. - Необходимо работать с общими наборами данных и таблицами на бизнес-уровне.
B) использование слоя сущностей, на который ссылаются другие слои. Этот слой будет содержать либо строго типизированные наборы данных, либо Plain Old C Objects. Объектами будут в основном данные контейнера и очень мало логики. это будут те же самые объекты, отправленные на уровень пользовательского интерфейса.
http://img8.imageshack.us/img8/6454/entities.png
http://dabbleboard.com/draw?b=eiu165&i=6&c=d0c2b346894a96b12bd3867f630e474a2af098fa
Работа с одинаковыми классами во всех слоях. Добавление ссылки на entity.dll во все слои.
C) использовать объекты передачи данных (только объекты conatiner), определенные на уровне DataAccess. затем использовать эти объекты для заполнения бизнес-объектов, которые отправляются на уровень пользовательского интерфейса.
http://img43.imageshack.us/img43/1236/transferp.png
http://dabbleboard.com/draw?b=eiu165&i=27&c=f886efa3f9d5eb4b45ddb02361c79cdcdaec0a9b
Профессиональный бизнес-уровень не должен работать с универсальными классами. Работая с двумя типами объектов, вам придется гидрировать бизнес-объекты с помощью объектов переноса.
У нас была дискуссия на работе, и мы хотели узнать, что думает сообщество. Я также добавил ссылку на доску объявлений. пожалуйста, скопируйте и создайте вместо редактирования.
Спасибо
4 ответа
Если вы используете многоуровневый подход, то есть все слои (по существу) выполняются в одном и том же пространстве процессов и поэтому нет маршалинга / сериализации, я бы пошел с подходом B. Создайте отдельный модуль для ваших сущностей, в котором все аспекты от вашей программы зависит, и пара к этому.
Однако, если вы используете многоуровневый подход, как следует из названия, то есть границы процесса и / или сети пересекаются, я бы посоветовал вам перейти к подходу C. Вы на самом деле не обмениваетесь примерами, Передача копий, так что любые преимущества, которые вы получаете при соединении с одним и тем же объектом, такие как наблюдаемые варианты, скажем, подхода MVC, все равно теряются. Лучше определять API данных на каждом уровне, чем пытаться использовать один и тот же класс.
Отличный вопрос - как всегда, ответ должен быть "все зависит".
О типе приложения и о том, действительно ли необходимо иметь бизнес-объекты (Entities), в отличие от объектов переноса (т. Е. Бизнес-объекты, которые не соответствуют друг другу, больше соответствуют объектам базы данных).
Традиционно я бы сказал, что вам всегда нужны общие наборы данных (или таблицы данных), исключительно из соображений производительности. Всякий раз, когда возникает необходимость работать, отображать или манипулировать большими наборами, традиционный строгий ОО-способ создания большого количества бизнес-объектов не удался.
Однако с тех пор, как я начал работать с Linq для SQL, мои парадигмы изменились. Больше нет необходимости в этом, поскольку модель Linq может быть всем: бизнес-объектами, объектами переноса и общими наборами данных. Я еще не исследовал, насколько хорошо это работает в действительно больших приложениях и должна ли быть необходимость изолировать интерфейсный код от модели Linq. Я обсуждал это с коллегами, но так или иначе не нашел ответа.
Я предполагаю, что все 3 слоя существуют в одном приложении. В версии Java, по крайней мере, я использовал Hibernate для доступа к данным и использовал эти компоненты данных на всех уровнях. (вариант B) Имеет смысл повторно использовать ваши сущности в ваших слоях.
Мне нравится вариант C, но он также дает мне паузу по двум причинам:
- Я должен распространять знания о том, что есть в слишком многих местах.
- DTO должны быть сериализуемыми, что не страшно, но все же необходимо учитывать.