metaclass: (Default)
[personal profile] metaclass
Не могу среди стандартных паттернов отыскать одну вещь, которая регулярно вылазит в моих программах.

Суть примерно такая: есть некий общий объект-менеджер, хранящий внутри себя общие сервисы, типа "запись в лог" "доступ к бд" "кэш вспомогательных объектов" и есть иерархия-дерево рабочих объектов, каждый из которых содержит одну-две-несколько коллекций подчиненных объектов, те в свою очередь свои подчиненные, итд.
Подчиненным объектам иногда требуются сервисы от их владельцев, и всем этим объектам требуются сервисы от главного объекта-менеджера.

Когда я все это делаю руками - получается практически идеально, объекты наследуются от базового, в котором есть ссылка на объект-владелец, и ссылка на объект-менеджер и есть фабрика, их создающая и проставляющая все эти ссылки, т.е. объект в кривом состоянии(с неназначенными ссылками) обычно не бывает.

Это все внутри слоя бизнес-логики, без всяких UI, а взаимодействие с базой данных делается вручную, тупым вызовом запросов из кода менеджера объектов.

Но вот сейчас решил поиспользовать NHibernate и генератор UI для объектов и выползли ЧЕРВИ. В частности, черви того плана, что назначить объект-менеджер и объект-владелец уже так просто не получится - эти объекты либо создаются в дебрях NHibernate либо в дебрях моего генератора, которые знать не знают и знать не хотят о окружении объекта.
Причем в экстремальных случаях задача такая: "объект копируется в виде xml в клипбоард" и потом "объект вставляется из клипбоарда в другом экземпляре программы". Обычный юзкейс - изредка перенести некий сложный объект из одной базы в другую.

Пока это все обходится безумными спагетти из интерфейсов, но обобщить до чего-то более менее вменяемого не получается, выглядит как печальное повторение на нескольких уровнях структурно одинакового кода, формальное назначение которого "проставить ссылки на окружение" и "проставить ссылку на объект владелец".
Частично помогает NHibernate - IInterceptor вставляет объекту ссылку на окружение в OnLoad. Но для объектов типа value внутри коллекций это не помогает - OnLoad вызывается только для Entity. В генераторе же UI приходится плясать с бубенцами самостоятельно, передавая контекст действий во все методы:)

Date: 2008-04-04 07:34 pm (UTC)
From: [identity profile] pete-by.livejournal.com
Может я не правильно понял суть проблемы, но не ясно зачем хранить ссылку на объект менеджер в других объектах? Он ведь общий (или идентичный) для всех объектов. Сам использую следующий подход:

AppContext context = AppContext.getInstance();
Logger logger = context.getLogger();
BeanFactory beanFactory = context.getFactory();

разумеется желательно, чтобы объекты были потокобезопасными.

Date: 2008-04-04 07:43 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Идея правильная, но объект не совсем общий. В другом месте программы может быть похожая иерархия, но с другим объектом-менеджером, например, работающим с другой базой данных.

Date: 2008-04-04 07:54 pm (UTC)
From: [identity profile] pete-by.livejournal.com
ну, у меня в одном j2ee-приложении вообще 4 разных контекста, для кажого отдельного модуля, со своими настройками и ничего страшного тут не вижу. Код там одинаковый - отличается только имя файла конфигурации, из которого настройки каждого модуля подбираются. Весь код менеджера влазит на один экран, в нем получение фабрики и логгера, i18n-ресурсы и собственно все. Наследование классу менеджера не требуется, можно вообще функции делать статическими, если что всегда можно возвращаемую реализацию класса фабрики изменить.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 1st, 2025 12:08 pm
Powered by Dreamwidth Studios