Постачальники даних

Програмний код, використаний в наступному прикладі, можна знайти на сторінці fileshtmсайта книги

Виникає питання: що потрібно робити, якщо виникає потреба в гнучкій конструкції, що допускає поновлення і навіть розширення режимів роботи програми без перекомпіляції Що робити, якщо джерелом даних клієнта є не традиційна база даних, а XML, або коли обчислені значення повинні бути повністю відокремлені Що робити, якщо доступ до даних повинен бути повністю прозорим для клієнтського коду Модель використання постачальників даних повністю вирішує ці та багато інших питань, в тому числі виділення логіки джерела даних з моделі фабрики і здатність динамічно коректувати режим роботи рівня даних під час виконання клієнтської програми

Термін постачальник даних також використовується компанією Microsoft в середовищі ADONET В даному випадку він позначає групу класів, які здійснюють доступ до конкретного джерела даних У справжньому розділі під постачальником даних розуміється окремий клас, який реалізує прозорий доступ до інформації, зазвичай зберігається в базі даних

Зазвичай файли конфігурації завантажуються тільки один раз, або при запуску програми, або в момент першого доступу до даних Однак іноді виникає необхідність корекції режиму роботи програми вже в процесі його роботи, без перезапуску У такій ситуації проблему може вирішити завантажувач параметрів, який здійснює моніторинг файлу конфігурації Клас PropertyLoader vb може стати відмінною стартовою точкою, і його можна знайти на сайті книги Для прикладу розглянемо Web-додаток, що працює під управлінням служби IIS, режим роботи якого необхідно динамічно коректувати Цей додаток працює в середовищі високої доступності, і його перезапуск для перезавантаження файлу конфігурації неприпустимо Реалізуючи завантажувач параметрів, реєструючий зміни файлу конфігурації і виконує в потрібний момент його перезавантаження, повністю відпадає необхідність у використанні перезавантаження програми Всі змінені значення заново завантажуються і стають доступними додатку в процесі його виконання

Постачальник даних являє собою задействуемих клієнтом клас, який абстрагує реалізацію джерела даних у своїй реалізації використовують шаблон моста і поліморфізм На рис 543 показана модель постачальника даних з точки зору абстрактного класу На рис 544 наведено контекстний приклад використання постачальника даних Address (DpAddress) і необхідних класів підтримки

Шаблон моста відокремлює інтерфейс від мінливої ​​реалізації На практиці На замітку це означає, що задействуемих клієнтом клас не змінює свій інтерфейс

Замість цього реалізація, що стоїть за інтерфейсом, варіюється відповідним чином для підтримки конкретного джерела даних Це також є прикладом поліморфізму, так як безліч класів підтримки забезпечують різну реалізацію за підтримки одного і того ж інтерфейсу

I Конкретний клас DpDeterminer, SqlOrAccessDeterminer, реалізує бізнес-логіку для оп- ределения того, з якою базою даних слід взаємодіяти Так як ця логіка ИНКАП-] сулірована з параметрами конфігурації, її ідентифікують, її можна вставити в будь-який клас, наслідуваний від DpDeterminer і змінює бізнес-логіку без перекомпіляції

Абстрактний базовий клас DataProvider являє собою ядро ​​динамічної ідентифікації та створення специфічною для джерела даних реалізації

Рис 544 У прикладі постачальника даних Address клієнтський код посилається лише на клас DpAddress

Рис 543 Цей приклад постачальника даних демонструє базові класи та необхідні файли конфігурації

Абстрактний базовий клас Dp implement at ion реалізує перший рівень ієрархії реалізації Він містить деякі загальні змінні і методи Від цього класу успадковуються конкретні реалізації

Як працює постачальник даних

Постачальник даних формує запит до асоційованого определителю і динамічно створює в процесі роботи специфічну для джерела даних реалізацію Різні файли конфігурації (див рис 543) забезпечують гнучкість постачальника і дозволяють під час роботи змінювати інформацію, необхідну для створення екземпляра класу, що визначає конкретну реалізацію

Клас Determiner грає критичну роль в моделі постачальника даних, так як він відділяє бізнес-логіку, визначальну, який джерело даних повинен підтримуватися і як до нього підключатися Це є основним відмінністю від моделей фабрики і DAO Визначник існує сам по собі і може замінюватися іншим у міру необхідності Схема, показана на рис 545, ілюструє фактичний потік завдань Зверніть увагу на те, що обєкти SqlOrAccessDeterminer і Address створюються на основі базового класу DataProvider Інформація, необхідна цим обєктам, міститься в файлах конфігурації Також зауважимо, що при виклику функції Load (id) специфічний для бази даних обєкт Address запитує інформацію про підключення до бази даних у обєкту SqlOrAccessDeterminer І, що більш важливо, клієнтський код взаємодіє тільки з обєктом DpAddress для завантаження і доступу до властивостей адреси Таким чином, з точки

Puc 545 Ця схема ілюструє створення постачальника даних Address, за чим слід завантаження відповідних даних адреси та доступ до конкретних полях

зору користувача, DpAddress є не більш ніж звичайним класом-з методами і властивостями Сам доступ до бази даних при цьому виконується за лаштунками.

У наступному програмному коді і наведеному за ним прикладі реалізації розглянемо базовий клас DpDeterminer

Базовий клас визначника

Public Mustlnherit Class DpDeterminer

Private Const BINDING_INFO_TAG As String = &quot_BindingInfo&quot

Private Const DESCRIPTION_TAG As String = &quot_Description&quot i i i_

111 Конструктор

I I I___________________________________________________________

Public Sub New()

‘Частина ініціалізації опущена Важливий конфігураційний файл,

‘Завантажуваний для доступу до властивості ..

1 Конфігураційний файл існує – завантажуємо його

PropertyLoaderInstanceLoadProperties(strPropertyFile)

End Sub

i i i___________________________________________________

111 Інформація щодо підключення та звязуванні для 11Поточного джерела даних

I I I____________________________________________________

Public Readonly Property Bindinglnfо () As String Get

Return PropertyLoaderInstanceGetProperty( _

MeGetTypeName &amp  &amp MeDataSource &amp

ВINDING_INFO_TAG)

End Get End Property

111 Джерело даних для цього визначника

I I I___________________________________________________________

Public MustOverride Readonly Property DataSource() As String i i i_______

111 Опис поточного джерела даних

I I I___________________________________________________________

Public Readonly Property Description() As String Get

Return PropertyLoaderInstanceGetProperty( _

MeGetTypeName &amp  &amp MeDataSource &amp

DESCRIPTION_TAG)

End Get End Property

Основна частина цього базового класу повертає різні значення файлу конфігурації залежно від типу визначника Найбільший інтерес представляє властивість MustOverride DataSource () Цей метод, визначений у класі-спадкоємця, містить бізнес-логіку, що визначає тип джерела даних, до якого здійснюється доступ Розглянемо приклад:

SqlOrAccessDeterminervb

Public Class SqlOrAccessDeterminer Inherits DpDeterminer i i i_________

11Внутрішня бізнес-логіка, визначальна, який тип’1 джерела даних буде використовуватися

I I I_________________________________________________

Public Overrides Readonly Property DataSourceO As String Get

With PropertyLoaderInstance If CBool(GetProperty(MeGetTypeName &amp &quot_UseSQL&quot)) Then Return GetProperty(MeGetTypeName &amp &quot_SqlTag&quot)

Else

Return GetProperty (Me GetType Name &amp _

&quot_AccessTag&quot)

End If End With End Get End Property End Class

Переглядаючи бізнес-логіку, закладену в класі SqlOrAccessDetermoner, зверніть увагу на те, що якщо _UseSQL має значення True, то визначник повертає рядок SqlTag, що вказує на використання бази даних SQL Server В іншому випадку повертається рядок AccessTag. Ключова концепція полягає в тому, що вся бізнес-логіка була повністю відокремлена від створення обєкта даних і тепер існує сама по собі Подібна слабка звязність підвищує гнучкість моделі

Іменами файлів конфігурації, відповідно до угоди корпорації Назаметку Microsoft, є <імя_сборкі> Dll Conf ig Тому при перегляді програмного коду майте на увазі, що файли конфігурації повинні носити саме такі імена, наприклад Providersdll conf ig або Provider Implementations dllconfig

Файл конфігурації, на який посилається SqlOrAccessDeterminer, виглядає наступним чином:

ProviderDeterminersdllconfig

&lt?xml version=&quot10&quot encoding=&quotutf-8&quot &gt

&ltconfiguration&gt

&ltappSettings&gt

&ltadd key=&quotSqlOrAccessDeterminer_UseSQL&quot value=&quotTrue&quot /&gt

&lt1– The tag values below are included in building a –&gt

&lt!– class instance namespace, ie –&gt

&lt!– ProvidersImplementationsSqlAddress or –&gt

&lt!– ProvidersImplementationsAccessAddress –&gt

&ltadd key=&quotSqlOrAccessDeterminer_SqlTag&quot value=&quotSql&quot /&gt

&ltadd key=&quotSqlOrAccessDeterminer_AccessTag&quot value=&quotAccess&quot /&gt

&lt/appSettings&gt

&lt/configuration&gt

При зміні значення True ключа SqlOrAccessDeterminer_UseSQL на False змінюється база даних і всі постачальники даних, що використовують даний визначник, без необхідності перекомпіляції програми Це є істотною перевагою, особливо в середовищі, в якій простої неприпустимі

Коли виникає необхідність створення завантажувача параметрів для управ- Раданя настройками програми, включайте в нього функції моніторингу зраді

ний файлу конфігурації Це дозволить автоматично перезавантажувати будь-які оновлення і використовувати їх у додатку без необхідності перезавантаження Середа NET пропонує підтримку моніторингу файлів за допомогою класу FileSystemWatcher Використовуючи цей клас, можна визначити, які файлові події слід обробляти і які методи для цього використовувати

Нижче наведено приклад файлу конфігурації, в якому продемонстровано, чому постачальникам даних так важливий внутрішній погляд на них і чому вони мають таке істотний вплив на доступ до даних

файл конфігурації Providers dll conf ig

&lt?xml version=&quotl 0&quot encoding= &quotutf -8[3] &gt

&ltconfiguration&gt

&ltappSettings&gt

&ltadd key=&quotDpAddress_Determiner&quot

value=&quotProviders Determiners SqlOrAccessDeterminer11 /&gt

&ltadd key=&quotDpAddress_Determiner_Assembly&quot

Value=&quotProviderDeterminers&quot /&gt

&ltadd key=&quotDpAddress_Instance&quot value=&quotAddress&quot /&gt

&ltadd key=&quotDpAddress_Instance_Assembly&quot value=11 Provider Implementations &quot / &gt

&ltadd key=&quotDpAddress_Instance_RootNameSpace&quot value=&quotProvidersImplementations&quot /&gt

&lt/appSettings&gt

&lt/conf igurat ion&gt

Рядок DpAddress_Determiner вказує, який визначник буде використовувати даний постачальник даних при створенні реалізації джерела даних З цієї причини будь-які зміни, які впливають на логіку визначника, будуть впливати на всі постачальники даних, що залежать від нього Також в розділ конфігурації включені значення, що визначають, в яких збірках слід шукати визначник, а також значення, необхідні для створення екземпляра постачальника даних методом відображення Тепер, коли ви побачили, як конфігурується постачальник даних, погляньте на програмний код Почнемо ми з базового класу DataProvider

Клас DataProvider vb

Public Mustlnherit Class DataProvider 1 Константи і локальні визначення опущені

I I I_____________________________________________________

1 Використовуючи новий визначник, отримуємо реалізацію

strAssembly = GetProperty(MeGetTypeName &amp _ INSTANCE_ASSEMBLY_TAG) strClass = GetProperty(MeGetTypeName &amp _ INSTANCEJROOT_NAME_SPACE) &amp

11&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp [4] &amp _ Determiner DataSource &amp 11 &quot &amp _ GetProperty (MeGetTypeName &amp INSTANCE_TAG)

1 Установка реалізації для постачальника даних

Implementation = Стурен (Activate (strAssembly, strClass), _ Dplmplementation) ImplementationDeterminer = Determiner End With End Sub

i i i_____________________________________________________

1 1 1 Створення примірника затребуваного класу 1 1 З заданої збірки

I I I____________________________________________________

Private Function Activate(ByVal strAssembly As String, _

ByVal strClassName As String) As Object код перевірки ..

1 створення екземпляра за допомогою відображення і його повернення

Dim instanceType As Type = _

SystemRef lection Assembly Load (strAssembly) GetType ( _                 strClassName)

Return ActivatorCreateInstance(instanceType)

End Function

1 Решта загальні методи підтримки опущені

‘Знайти їх можна на сайті книги

End Class

Конструктор намагається завантажити файл конфігурації, а потім починає динамічно створювати екземпляри класу Спочатку створюється визначник, повязаний з постачальником даних (визначений у файлі конфігурації) Потім створюється конкретна реалізація джерела даних (Access, SQL і тп), ідентифікована даними визначником Код автоматично виконується, коли постачальник даних ідентифікується На етапі проектування це звільняє розробника від створення класів подцержку, і він може зосередити свою увагу на деталях постачальника даних Постачальник даних Address наведено нижче

Постачальник даних DpAddress vb

Public Class DpAddress Inherits DataProvider Implements Iaddress 1 Цей клас тільки представляє реалізацію властивостей,

‘Визначених у інтерфейсі IAddress Памятайте, що цей 1 інтерфейс також реалізований в класах, специфічних 1 для джерела даних

I I I_________________________________________________________

1 1 1 Допоміжний метод перетворює реалізацію в 11 відповідний тип Implementation – це властивість,

1 1Визначене в базовому класі DataProvider

I I I_________________________________________________________

Protected Function Mylmplementation() As Iaddress Return CType(Implementation, IAddress)

End Function Ось приклад властивості

I I i_________________________________________________________

End Get

Set(ByVal Value As String)

MyImplementationCity = Value End Set End Property

‘Всі інші властивості інтерфейсу представляються аналогічним 1 чином

End Class

Будучи спадкоємцем класу DataProvider, клас DpAddress приймає всю функціональність створення Реалізуючи інтерфейс IAddress, клас DpAddress погоджується із загальним контрактом, визначальним його можливості Єдиним додатковим методом цього класу є My Implement at ion (), і він був введений для зручності розробника і активізації функції IntelliSense програми Visual Studio Тепер розглянемо засоби, що забезпечують реалізацію джерела даних Перед розглядом специфічних особливостей реалізації поглянемо на базовий клас Dp Implement at ion vb

Базовий клас Dp Implementation, vb

i i i____________________________________________________________

11 Визначник ii i________________________________________________

Public Property Determiner() As DpDeterminer

1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Реалізація вкрай проста, тому вона опускається

End Property

I I I___________________________________________________________

11Конструктор

I I I___________________________________________________________

Public Sub New()

‘Завантаження відповідного файлу конфігурації

Dim strFileName As String

strFileName = MyApplicationCurrentDirectory &amp &quot\&quot &amp

MeGetTypeModuleScopeName &amp &quot.config&quot

‘Завантаження файлу властивостей

PropertyLoaderInstanceLoadProperties(strFileName)

End Sub End Class

Цей клас реалізації містить властивість Determiner, локальне сховище і завантажує відповідний файл конфігурації Фактична робота по створенню, читання, оновлення та видалення міститься в специфічною для джерела даних реалізації

У мові VBNET 2005 було введено ключове слово Му, що забезпечує Новинка ^ зручний доступ до загальних значень запущеної програми і платформи, в ко-

2005 торою вона встановлена Завдяки використанню ключових слів му, Appli

cation, user і WebServices доступ до значень стає набагато легше

У попередніх версіях VBNET, коли розробнику потрібно було визначити теку-/ На замітку щий каталог, використовувався метод AppDomain CurrentDomain BaseDirectory – Цей метод повертав роздільник PathDirectorySeparatorChar О, добав

ленний в кінець рядка Нова властивість MyApplicationCurrentDirectory () повертає поточний каталог без додавання роздільника Це дозволяє скоротити програмний код, який раніше припускав існування символу каталогу наприкінці рядка

Нижче наведений базовий клас реалізації, службовець основою всіх класів, специфічних для баз даних

Базовий клас ImplAddress vb

Public Mustlnherit Class ImplAddress Inherits DpImplementation Implements Iaddress

Private m_CurrentValues As doAddress Private m_OriginalValues As doAddress 1 Цей клас реалізує інтерфейс Iaddress,

1 загальний для всіх реалізацій, специфічних для 1 джерел даних

‘Окремо від оголошень обєктів даних, наведених вище,

1 в даному класі немає нічого особливого При бажанні ви можете переглянути повний програмний код на сайті книги

I&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp I I  

II&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Завантаження визначення інтерфейсу Вона повинна застосовуватися в 1 11 класах-спадкоємців

I&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp I I  

Public MustOverride Sub Load(ByVal strld As String)

End Class

Клас ImplAddress забезпечує загальну функціональність всіх реалізацій, залишаючи специфічні для джерел даних функції конкретним реалізаціям Все це можна побачити в оголошенні методу Load (..) Також відзначте для себе, що метод Load (..) був оголошений з атрибутом MustOverride Таким чином, всі дочірні класи повинні реалізувати власну інтерпретацію цього методу Ще слід звернути увагу на обєкт даних doAddres Цей обєкт зберігає стан класу Address, звертаючись до нього як до нагадування (memento)

Підтримка нагадувань забезпечує захоплення і виділення всіх внутрішніх станів екземпляра Такий режим роботи забезпечує масу переваг, включаючи сериализацию значень, відстеження стану обєктів, скасування і повторне виконання функцій, просту перевірку на рівність і тд

Виділяйте стан постачальників даних, використовуючи обєкти нагадувань, які можна використовувати для збереження і завантаження стану обєкта, тестування рівності і поточних змін значень, зокрема функціональності IsDirty ()

Абстрактний клас DataObject vb забезпечує функціональність батьківських обєктів при створенні обєктів даних memento Цей абстрактний клас містить методи відображення, службовці для клонування обєктів, переустановлення їх значень і їх порівняння Повний програмний код цього базового класу наведено на сайті книги

Розглянемо специфічний для джерела даних клас Address

Address Vb – реалізація SQL Server

11&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp   

1 1 Це реалізація SQL Server

! I_________________________________________________________________

Public Class Address Inherits ImplAddress i i i_________________________

111&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Фактична функція завантаження реалізації SQL Server

I i i_______________________________________________________________

Public Overrides Sub Load(ByVal strld As String)

Dim cmd As SqlCommand = Nothing Dim conn As SqlConnection = Nothing Dim dataReader As SqlDataReader = Nothing Try

1 установка підключення до бази даних за допомогою 1 інформації визначника

conn = New SqlConnection (MeDeterminerBindinglnfо) connOpen ()

1 Налаштування команди

cmd = New SqlCommand( PropertyLoaderInstanceGetProperty( _ &quotSql_Address_Select&quot ) Replace (&quot%111, _ strldToString) , conn) dataReader = cmdExecuteReader( _

CommandBehaviorCloseConnection)

If dataReaderRead Then

MeStreetl = MySqlHelperGetStringValue( _ dataReader, 11 Street 111, &quot&ltno value&gt&quot)

MeStreet2 = MySqlHelperGetStringValue( _ dataReader, 11 Street2&quot, &quot&ltno value&gt&quot)

1 Аналогічний програмний код використовується для ініціалізації 1 міста, штату, індексу і тд

End If

MeSetOriginalValues()

Catch ex As Exception 1 Тут виконується обробка

Throw(ex)

Finally 1 Очищення

If cmd IsNot Nothing Then cmdDispose If conn IsNot Nothing Then connClose()

If dataReader IsNot Nothing Then dataReaderClose()

End Try End Sub End Class

Оскільки клас Address є дочірнім для класу ImplAddress, він успадковує повний інтерфейс і не зобовязаний турбуватися про визначення методів установки і перевірки властивостей окремих полів Замість цього даний клас фокусує свою увагу на специфіці взаємодії з базою даних SQL Server і наповненні відповідного обєкта даних Те ж справедливо і для класу Address, призначеного для доступу до баз даних Access

При визначенні загальних контрактів (інтерфейсів програмування і методів) постачальників даних використовуйте інтерфейси Це дозволяє забезпечити узгодженість використовуваних клієнтом обєктів даних і специфічних для конкретних баз даних реалізацій цих обєктів Це також дозволяє клієнтам створювати власні класи, що реалізують певні інтерфейси, і вставляти їх в додатки

Клієнтський програмний код в наступному прикладі використовує саме такий шаблон Порівняйте його з програмним кодом фабрики і DAO, представленими раніше

Постачальник даних MainTester

Public Class MainTester

” Цей метод тестує постачальника даних

1 I 1__________________________________________________________

Sub Main()

Try

Dim objAddr As New Address objAddrLoad(&quot1&quot )

Call PrintAddress(objAddr)

Catch ex As Exception

ConsoleWriteLine(exMessage)

End Try End Sub End Class

Цей клієнтський тестовий програмний код навіть менше за розміром, ніж використовуваний для роботи з фабрикою, до того ж в даному випадку немає ніякої необхідності в перетворенні обєкта Насправді даним клієнтського коду навіть не потрібно знати, що для доступу до джерел даних використовуються різні класи Якщо в рішенні має значення компактність клієнтського програмного коду, то слід використовувати підхід із застосуванням постачальника даних Якщо порівняти його з підходом DAO, то в даному клієнтському коді існують три рядки замість семи, до того ж у ньому більше інтуїтивно зрозуміла робота з обєктом даних Address, оскільки в ньому немає відмінностей від стандартного коду, зокрема, використовується команда Dim strSomeString As String

Переваги шаблону постачальника даних

Шаблон постачальника даних може бути надзвичайно гнучким, дозволяючи клієнтові або розробнику швидко заміщати класи доступу до даних і вказувати, які постачальники даних використовуються і до яких джерел даних можна підключатися Так як реалізації постачальника даних можуть бути виведені з програми, стає досить просто вносити зміни в файл конфігурації, оскільки при розгортанні нової збірки немає необхідності вносити зміни у файл конфігурації До того ж здатність зміни режиму роботи програми після розгортання є додатковим достоїнством додатка як з точки зору користувача, так і виробника програми

Недоліки шаблону постачальника даних

При використанні шаблону постачальника даних потрібно більш уважно встановлювати зовнішні значення, що містяться в конфігураційних файлах, створювати простору імен для класів і організовувати програмний код Крім того, ця модель складніша, ніж дві інші, про які ми говорили раніше Вона вимагає більшого часу навчання і великих теоретичних знань в області обєктно-орієнтованих технологій Ця додаткова складність може підійти не всім проектам і командам програмістів

Повний проект Data Providers ви можете знайти на сторінці fileshtm сайту книги У нього включені всі шаблони, які можуть стати відправною точкою у створенні постачальників даних

Резюме

Якщо ви визначили, що в додатку потрібно створити рівень доступу до даних, то повинні задати собі ряд питань щодо моделі, яку хочете реалізувати для доступу користувачів до даних, і вирішити, який шаблон найбільше відповідає вашим потребам Вибір найбільш відповідного шаблону може прискорити процес програмування і підвищити розширюваність на етапі розробки, одночасно знижуючи витрати на супровід рівня доступу до даних

Виділяючи запити SQL, залежно бази даних і бізнес-логіку у файли конфігурації, як це реалізовано в шаблоні постачальника даних, ви забезпечуєте гнучкість модернізації додатків на етапі їх експлуатації Ви можете навіть підтримувати нові бази даних, додаючи нові елементи у файли конфігурації і створюючи специфічні для баз даних збірки NET без перекомпіляції додатків і їх перезапуску Ця можливість динамічної коригування рівня доступу до даних без перекомпіляції і перезавантаження здатна забезпечити мінімально можливий час відсутності доступу до даних, тобто їх підвищену доступність

У цьому розділі були описані всього три шаблону доступу до даних, в той час як існує безліч інших Не бійтеся випробувати інші рішення забезпечення доступу до даних і грунтовно підходите до питань їх вибору

Маючи гнучкий, добре пророблений рівень доступу до даних, ви забезпечите собі безліч переваг на етапі проектування додатків, їх реалізації та розгортання

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*