Форум: "Прочее";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
ВнизMVC — спрашивали? :) Найти похожие ветки
← →
Kolan © (2007-09-26 21:31) [0]Описываю задачу, она большая, поэтому опишу только часть.
Доктор должен оценивать качество историй болезни. Он берет историю(бумажную), создает в программе карточку оценки, и начинает проверять историю, выбирая из списочка «косяки»(например «диагноз описан не полностью ит.д.»).
Карточки, которые он заполняю «находятся» в пакетах. Карточка – сложная штука состоит из блоков блоки из групп.
Итак в Domain есть объекты:Пакет, Карта, Блок, Группа.
Рассмотрим 1(одну) системную операцию – «Загрузка списка пакетов» (напоминаю, в пакетах лежат карточки).
Список пакетов – это такой объект:TPackageList = class(TCustomIndexedDomainListObject)
private
function GetItem(Index: Integer): TPackage;
procedure SetItem(Index: Integer; const Value: TPackage);
function GetCurrentObject: TPackage;
procedure SetCurrentObject(const Value: TPackage);
public
function Add(Package: TPackage): Integer;
property Items[Index: Integer]: TPackage read GetItem
write SetItem; default;
property CurrentObject: TPackage read GetCurrentObject
write SetCurrentObject;
end;
По сути это список, к которому могут подключаться обозреватели. См.
http://delphimaster.net/view/1-1190091044/
Работает так:
Пользователь командует(Например стреляет Action) контроллеру.GetControllerManager.GetController.Load;
Контроллер получает экземпляр списка пакетов и отправляет его на загрузку из базы:procedure TPackageController.Load;
begin
inherited;
GetDataAccessFacade.LoadPackages(GetDomainManager.Packages);
end;
Загрузка выглядит так:procedure TDataAccessFacade.LoadPackages(PackageList: TPackageList);
var
Query: TADOQuery;
TempPackage: TPackage;
begin
if Assigned(PackageList) then
begin
Query := TADOQuery.Create(nil);
try
Query.Connection := FDBConnection;
Query.SQL.Add("SELECT * FROM ExpertAppraisalPackage");
Query.Open;
if not Query.Eof then
begin
PackageList.AllowChangeNotification := False;
PackageList.Clear;
while not Query.Eof do
begin
with Query do
begin
TempPackage := TPackage.Create(FieldByName("PackageName").AsString,
FieldByName("CreationDate").AsDateTime);
TempPackage.ID := FieldByName("cdpackage").AsInteger;
PackageList.Add(TempPackage);
end;
Query.Next;
end;
PackageList.AllowChangeNotification := True;
end;
finally
Query.Free;
end;
end;
end;
Строка:PackageList.AllowChangeNotification := False;
Запрещают списку пакетов рассылать уведомления при изменении.
Как только выполняется:PackageList.AllowChangeNotification := True;
Список сам уведомляет своих обозревателей.
Получив уведомление обозреватель «рисует» список пакетов на TListViewprocedure TPackagesView.Update(ASubject: TCustomDomainObject);
begin
inherited;
if ASubject is TPackageList then
ViewPackageList(FListView, (ASubject as TPackageList));
end;
В принципе все.
В итоге.
Domain вообще ничего не знает ни о ком.
View знает о Domain и все, он также ничего не знает о форме все контролы передаются в конструкторе.
DAL уровень тоже знает только о Domain.
Контроллеры знают о Domain и DAL.
Кроме контроллеров можно все пользовать заново. Так как база(большущая) одна для почти десятка программ, то думаю reuse получится.
Тут много недочетов вот основные:
1. В DAL слое куча лишнего кода. Надо бы разделить его на низко уровневый и высоко уровневый.
2. Получается что объекты Domain уведомляют только о изменении, а что конкретно поменялось не говорят. Исправил уже, теперь можно создавать разные типы обозревателей.
ЗЫ
Сразу скажу что за последние два дня я много что по изменял и этот пример прилично устарел… Но идея такая…
← →
Kolan © (2007-09-28 15:10) [1]Бакук спрашивал, спрашивал и забыл…
← →
имя (2007-10-07 22:12) [2]Удалено модератором
← →
имя (2007-10-07 22:24) [3]Удалено модератором
← →
имя (2007-10-07 22:27) [4]Удалено модератором
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.052 c