Как абстрагировать мою бизнес-модель, используя dbExpress и Delphi (возможно, и DataSnap)? - PullRequest
2 голосов
/ 02 октября 2011

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 02 октября 2011

Компоненты

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-данных, когда элементы управления пользовательского интерфейса в основном подключаются прямо к столбцам / таблицам базы данных.

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

2 голосов
/ 02 октября 2011

Проект, над которым вы работаете, - это Многоуровневое приложение базы данных Delphi

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

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

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

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

...