Основные характеристики современных принтеров
Введение в ObjectSpaces
Тимофей Казаков (TK)
Сохраняемые объекты
В .NET Framework управление данными осуществляется на
уровне объектов. Каждый объект характеризуется своим состоянием (свойства), поведением
(методы), и является экземпляром какого-либо конкретного класса. В рамках
приложения классы могут различаться по целевому назначению – это могут быть
элементы управления, отображающие интерфейс пользователя, или сервисные классы,
отвечающие за связи с базами данных и работу с сетевыми функциями, это могут
быть классы “сообщений”, обеспечивающие обмен информацией между частями
приложения. Все эти сущности объединяет одна общая черта – время их жизни
обычно не превышает времени жизни всего приложения. Но, кроме вышеперечисленных
категорий классов, можно выделить целый ряд сущностей, время жизни которых
превышает срок жизни приложения. Например, в бизнес-задачах роль подобных
сущностей могут играть объекты “Клиент”, “Заказчик”, “Продукт”. Таким объектам
необходимо предоставить возможность сохранения своего состояния во внешнее
хранилище.
В .NET Framework существуют готовые средства для
работы с сохраняемыми объектами, – есть возможность сохранять состояние
объектов в двоичном виде с использованием BinaryFormatter или XML-формате с
использованием XmlSerializer. Все эти средства предоставляют возможности
сохранения “графов” объектов, однако сохраняемая информация не оптимизирована
для выполнения запросов к хранимым данным – так, поиск необходимой информации в
XML-файле, содержащем несколько тысяч записей, может оказаться неприемлемо
медленным. В большинстве подобных случаев в качестве хранилища информации
подойдет реляционная СУБД – данные сохраняются в таблицах, для дополнительного
контроля целостности между ними устанавливаются отношения, поиск информации
осуществляется с использованием языка запросов SQL. Аналогичную
функциональность предоставляют специальные библиотеки Object/Relational Mapping
(O/R Mapping). Такая библиотека перекладывает на себя всю “черную” работу по
сохранению/загрузке информации из объектной модели приложения в реляционную
модель базы данных. В .NET Framework 1.2 для этих целей есть специальный набор
классов из пространства имен System.ObjectSpaces.*.
ObjectSpaces
Если раньше, используя ADO.NET, нужно было
самостоятельно писать SQL-запросы, то теперь это требование становится
необязательным – ObjectSpaces берут на себя всю заботу об отображении классов
приложения на различные источники данных. При этом мы можем создавать новые объекты,
сохранять их, выполнять различные запросы - все необходимые действия по
взаимодействию с источником данных будут выполняться внутри ObjectSpaces (при
этом данные могут находиться как в традиционной БД, так и быть представленными
в XML форме)
ПРЕДУПРЕЖДЕНИЕ
Текущая версия ObjectSpaces
поддерживает в качестве источника данных только SQL Server 7.0 и выше.
|
Для объектов приложения ObjectSpaces предоставляет
следующие возможности:
Прозрачное отображение экземпляров .NET объектов на
источник данных.
Поддержку иерархий классов для сохраняемых объектов.
Сохранение взаимосвязей между объектами (один к
одному, один ко многим, многие ко многим).
Отложенную загрузку связанных объектов. Построение
запросов с использованием OPath.
Архитектура ObjectSpaces
Какая функциональность требуется от O/R
Mapping-библиотеки? Кроме очевидных задач – загрузки/сохранения состояния
объекта и выполнения операций поиска, есть и менее очевидные задачи –
отслеживание состояния и идентификация объекта. Для чего это нужно?
Отслеживание состояния требуется для принятия решения
о необходимости сохранения объекта. Совершенно очевидно, что если ни одно из
полей объекта не изменялось, то повторно сохранять ту же информацию совершенно
не обязательно. Информация об оригинальных значениях полей может понадобиться и
для достижения “оптимистической параллельности” (optimistic concurrency) в
ситуациях, когда в БД нет колонки с версией записи. Также можно оптимизировать
сохранение полей объекта для ситуаций, когда один объект отображается на
несколько таблиц в базе данных, просто не обновляя не изменившиеся данные.
ПРИМЕЧАНИЕ
Optimistic concurrency (оптимистический
параллелизм) – это возможность двум независимым клиентам редактировать одну и
ту же информацию без дополнительной блокировки каких-либо ресурсов. Все
проверки относительно правомочности сделанных изменений осуществляются только
в момент сохранения записи. Это можно реализовать, например, добавлением в
таблицу специального поля для идентификации версии записи (например, timestamp).
|
В каких случаях нужно уметь идентифицировать объект? В
случае с O/R Mapping-библиотекой мы работаем не с “сырыми” данными, а с
реальными объектами. Это значит, что одному значению первичного ключа в базе
данных должен соответствовать один объект в приложении. В самом деле, разумно
рассчитывать, что все возможные способы получения одного и того же объекта из
базы данных каждый раз должны возвращать одну и ту же ссылку. Это означает, что
O/R Mapping-библиотека должна отслеживать все загружаемые объекты, и в случае
повторной попытки восстановить объект с тем же значением первичного ключа
возвращать ссылку на уже загруженный.
Есть два варианта отслеживания состояния объекта. В
первом варианте инициатором сохранения состояния выступает сам объект. По
второму варианту объект играет пассивную роль, а вся необходимая
функциональность реализуется в библиотеке O/R Mapper. Разберем каждую из двух
реализаций более подробно.
Инициатором сохранения выступает объект. В данной
ситуации O/R Mapper предоставляет механизм хранения оригинальных и текущих
значений, а “сохраняемый” объект выступает лишь интерфейсом для работы c этим
хранилищем. Здесь можно выделить два возможных направления:
“Сохраняемый” класс описывается на некотором метаязыке.
Что это за метаязык, и какие средства работы с ним используются, в общем случае
не столь важно. Отличительной особенностью данной реализации является то, что
весь необходимый код отслеживания состояния генерируется на этапе разработки
(компиляции). В качестве примера подобного подхода можно взять реализацию
Borland Enterprise Core Objects (ECO).
Все свойства, для которых необходимо предоставить
возможности “сохранения” объявляются как абстрактные, сам такой класс также
становится абстрактным (MustInherit в VisualBasic). На O/R Mapping-библиотеку в
такой ситуации ложится ответственность за создание наследника “сохраняемого”
(например, через Reflection.Emit) класса с неизбежной реализацией всех
сохраняемых свойств, и предоставление фабрики класса для его создания. Найти
реализацию подобной функциональности можно в ранней preview-версии ObjectSpaces
и в EntityBroker (#"7231.files/image002.jpg">
Рисунок 1 Архитектура ObjectSpaces.
Схемы данных
Для большинства приложений описать однозначное (“один
к одному”) отображение объектной модели данных на реляционную модель нельзя,
иногда нужно специально описывать то, как объекты должны отображаться на
источник данных. В ObjectSpaces эту задачу выполняет класс MappingSchema
(пространство имен System.Data.Mapping). Данный класс предназначен для
описания:
RSD (Relational Schema Definition) – схемы, которая
описывает таблицы, поля и отношения между ними;
OSD (Object Schema Definition) – схемы,
описывающей объекты;
MSD (Mapping Schema Definition) – схемы отображения.
ObjectSpaces дает возможность самостоятельно
формировать состояние класса MappingSchema или загружать его состояние из
XML-файла. Рассмотрим использование MappingSchema на основе базы данных
Northwind из состава SQL Server. На первом этапе нужно описать структуру этой
базы данных в RSD-схеме:
<rsd:Database
Name="Northwind" Owner="sa"
xmlns:rsd="#"7231.files/image003.jpg">
Рисунок 2. ER-диаграмма
Кроме этого, понадобится описать OSD-схему, которая
будет описывать объекты C#-кода.
<osd:ExtendedObjectSchema
Name="DataTypesOSD"
xmlns:osd="#"7231.files/image004.jpg">
Рисунок 3. Объектная модель.
После объявления RSD- и OSD-схем (рисунок 3), нужно
создать Mapping-схему, которая определит отображение одной схемы на другую:
<m:MappingSchema
xmlns:m="#"7231.files/image001.gif">#"7231.files/image005.gif">
Рисунок
4. Microsoft ObjectSpaces Mapper Utility.
Кроме этого, в данный пример входит реализация класса
ObjectPersistence. Этот класс обладает одной характерной особенностью – он
скрывает в себе не только создание XML-описаний, но и создание необходимой базы
данных. Рассмотрим простейший пример использования ObjectPersistence.
using System;
using
Microsoft.ObjectSpaces.ObjectPersistence;
class
ObjectPersistenceDemo
{
// Исходный код класса
ObjectPersistence также доступен в рамках примера
static
ObjectPersistence op = new
ObjectPersistence("Data Source=local; Integrated Security=true;",
"Persistence");
static void
Main(string[] args)
{
Customer c =
new Customer();
// Ищем заказчика в базе данных
c =
(Customer)op.LoadObject(typeof(Customer), "CustomerID = 'alfki'");
if (c == null)
{
c = new
Customer("alfki");
c.Comments =
"New Customer";
else
{
c.Comments =
"Old Customer";
}
// Сохраняем изменения.
// Если база данных/таблица еще не созданы, то это
произойдет сейчас
op.Persist(c);
}
}
|
Класс ObjectPersistence спроектирован таким образом,
что для его использования не обязательно предварительно создавать базу данных,
настраивать XML-схемы данных – все это делается внутри реализации
ObjectPersistence. Так, в приведенном выше примере на SQL Server будет создана
база данных Persistence, и в нее будет добавлена таблица с именем Customer.
Конечно, не в каждом проекте можно допустить подобные вольности со стороны
библиотеки доступа к данным, но для простейших реализаций – это замечательная
возможность скрыть ненужные детали.
Итог
Технологии доступа к данным в .NET Framework 1.2
содержат множество полезных нововведений, но если для ADO.NET это скорее
эволюционные изменения, связанные с простым расширением библиотеки, то
ObjectSpaces является совершенно новым продуктом, который может кардинальным
образом изменить подход к работе с данными. Конечно, в настоящий момент работа
над библиотекой еще далека от завершения. К моменту выхода VisualStudio
«Whidbey» мы сможем увидеть в ней массу изменений, начиная с использования
generics и расширения возможностей OPath, и заканчивая DML-операторами для
удаления объектов без предварительного их извлечения.
Список литературы
Для подготовки данной работы были использованы
материалы с сайта http://www.rsdn.ru/
Похожие работы на - Основные характеристики современных принтеров
| | |