Как абстрагировать мою бизнес-модель с помощью dbExpress и Delphi (может быть, и DataSnap)?

Если мой вопрос не ясен, пожалуйста, помогите мне улучшить его с комментариями.

Я новичок в Delphi и dbExpress и только знакомлюсь с классами TSQLDataset, TDataSetProvider, TClientDataSet и TDataSource.

В проекте, над которым я работаю, эти компоненты используются странным для меня образом. Существует огромный модуль модуля данных, который содержит множество ранее описанных четырех классов. Я предполагаю, что есть лучшие (и более модульные) способы сделать это. DataSnap используется только для размещения этого модуля данных в серверном приложении, поэтому клиенты получают доступ к данным через него.

Итак, позвольте мне попытаться объяснить некоторые из моих сомнений:

  1. Какова роль каждого из этих классов? Я читал документацию, но не могу получить практического представления об этом предмете (особенно о TDataSetProvider).
  2. Какие классы должны быть в модуле данных и какие должны быть в моих формах?
  3. Можно ли создать промежуточный слой, чтобы абстрагировать мою бизнес-модель от моей базы данных (может быть, создать функции, возвращающие неизменяемые наборы данных?)?
  4. Если да, то целесообразно ли использовать для этого DataSnap?

Извините, если я недостаточно ясно выразился. Заранее спасибо.


person ivarec    schedule 02.10.2011    source источник


Ответы (2)


Компоненты

TDataSource — это мост между элементами управления с поддержкой данных и набором данных (потомком TDataSet), из которого они должны получать свои значения.

TClientDataSet — один из таких наборов данных. TClientDataSet можно использовать изолированно, например, для доступа к данным, содержащимся в файлах xml, но его также можно подключить к TDataSetProvider.

TDataSetProvider — это мост между TClientDataSet в памяти и фактическим набором данных, который берет свои данные из базы данных через какой-то драйвер. При разработке клиент-сервера вы обычно будете видеть TRemoteDataSetProvider (имя может быть другим, я не так часто работаю с этими компонентами), который устраняет разрыв между клиентом и сервером.

TSQLDataSet — это фактический набор данных, получающий данные из некоторой базы данных.

Мне было бы странно видеть весь этот квартет в одном исполняемом файле. Я ожидаю, что TSQLDataSet на стороне сервера будет подключен к ответной части TRemoteDataSetProvider. Тем не менее, я предполагаю, что со встроенной базой данных это может быть способом поддержки модели портфеля, где TClientDataSet действительно полезен (TClientDataset очень мощный, это только одна из его сильных сторон).


Один модуль данных

Ой. Один огромный модуль данных — это ленивое программирование или результат неправильного представления о том, как использовать модули данных. Совершенно нормально иметь один модуль данных, который «размещает» соединение с базой данных, которое затем используется различными другими модулями данных, которые более тесно связаны с аспектами приложения.


Абстракция домена

Что касается абстрагирования вашей бизнес-модели, dbexpress и datasnap действительно не должны быть нигде в вашей бизнес-модели. Они должны быть частью вашего уровня данных.

TDataSource, TClientDataSet и настраиваемые потомки TDataSetProvider можно использовать для усиления возможностей элементов управления с поддержкой данных в пользовательском интерфейсе, сохраняя при этом пользовательский интерфейс отдельно от бизнес-модели. В этом случае пользовательский TDataSetProvider будет мостом между клиентским набором данных и коллекциями и экземплярами на уровне предметной области.

Несмотря на это, я все равно ожидал бы увидеть отдельный уровень данных, использующий TRemoteDataSetProviders или прямых потомков TDataSet (таких как TSQLDataSet), чтобы обеспечить слой домена своими данными.

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

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

person Marjan Venema    schedule 02.10.2011
comment
Итак, в моем клиентском приложении я увижу только поставщиков наборов данных, клиентские наборы данных и источники данных? Другое дело: являются ли модули данных хорошим местом для реализации отдельного уровня данных? Ваш ответ великолепен, и я думаю, что это может быть очень хорошей отправной точкой для людей, желающих разрабатывать приложения для баз данных в Delphi. Я сам читал документацию, но до сих пор не мог собрать воедино. - person ivarec; 03.10.2011
comment
@haole: да, это те компоненты, которые я ожидаю от клиентского приложения. Модули данных прекрасно подходят для реализации отдельного уровня данных. Хотя они вам не нужны. Я бы просто использовал обычные единицы и создавал экземпляры компонентов во время выполнения, подключая обработчики событий по мере необходимости через код (несколько вопросов по этому поводу здесь, в SO). У него есть дополнительное преимущество: он не имеет dfm модуля данных и всех проблем с синхронизацией/слиянием, которые возникают с файлами dfm и системой контроля версий. - person Marjan Venema; 03.10.2011

Проект, над которым вы работаете, представляет собой многоуровневое приложение базы данных Delphi.

Ваш вопрос слишком широк для SO, и на него вряд ли можно ответить в его нынешнем виде - вам следует научиться понимать базовую архитектуру.

Вы можете начать с видеоурока Павла Гловацкого:

http://www.youtube.com/watch?v=B4uxLLIUddg

http://cc.embarcadero.com/item/28188

person kludg    schedule 02.10.2011
comment
Эти руководства просто показывают мне, как поместить мою базу данных в другое приложение с помощью DataSnap. Это не абстрактная концепция: пользовательский интерфейс по-прежнему очень тесно связан с базой данных. - person ivarec; 03.10.2011