Глава 11. Объектно-реляционные типовые решения... 231
protected abstract String findStatement(); public
void LoadLine (IDataReader reader, ^DomainObject
obj) {
if (obj.IsGhost) {
obj.MarkLoading(); doLoadLine
(reader, obj); obj.MarkLoaded();
} }
protected abstract void doLoadLine (IDataReader reader,
^DomainObject obj);
Как и в предыдущих примерах, супертип слоя выполняет все действия, вынесенные в
абстрактный класс, после чего вызывает абстрактный метод для конкретного производ-
ного класса. В этом примере я воспользовался объектом DataReader — моделью поточ-
ного считывания данных с помощью курсора, которая сегодня применяется на различ-
ных платформах. При желании можете расширить данный пример на использование
объекта DataSet, более популярного в среде .NET.
В нашем примере у объекта Employee ("сотрудник") есть три типа свойств: поле Name
("имя"), имеющее простое значение типа string, поле Department ("отдел"), значение
которого является ссылкой на другой объект, и поле TimeRecords ("трудовой стаж"),
значением которого является коллекция. Загрузку всего этого содержимого выполняет
реализация метода doLoadLine () в производном классе (рис. 11.5).
class EmployeeMapper...
protected override void doLoadLine (IDataReader reader,
^DomainObject obj) {
Employee employee = (Employee) obj;
employee.Name = (String) reader["name"];
DepartmentMapper depMapper = ^(DepartmentMapper)
MapperRegistry.Mapper(typeof(Department));
employee.Department =
'bdepMapper.Find((int)reader["departmentID"] ) ;
loadTimeRecords(employee) ; }
Значение поля Name зафужается путем простого считывания значения соответствую-
щего столбца, на которое указывает курсор объекта DataReader. Значение поля De-
partment считывается с помощью метода поиска объекта DepartmentMapper. В резуль-
тате применения этого метода значением поля Department станет фиктивный объект;
настоящие данные об отделе будут считаны только тогда, когда кто-то попытается осу-
ществить доступ К самому объекту Department.
С коллекцией дело обстоит немного сложнее. Чтобы избежать волнообразной зафуз-
ки, все записи о стаже работы должны быть извлечены посредством одного запроса.
Для этого понадобится особая реализация списка, которая будет выступать в роли фик-
тивного списка. Последний является всего лишь оболочкой реального списка и передает
ему управление всеми действиями, затрагивающими содержимое списка. Единственное,
что делает фиктивный список, — это следит за тем, чтобы любая попытка доступа к спи-
ску приводила к выполнению зафузки.