Странный паттерн
Apr. 4th, 2008 09:34 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Не могу среди стандартных паттернов отыскать одну вещь, которая регулярно вылазит в моих программах.
Суть примерно такая: есть некий общий объект-менеджер, хранящий внутри себя общие сервисы, типа "запись в лог" "доступ к бд" "кэш вспомогательных объектов" и есть иерархия-дерево рабочих объектов, каждый из которых содержит одну-две-несколько коллекций подчиненных объектов, те в свою очередь свои подчиненные, итд.
Подчиненным объектам иногда требуются сервисы от их владельцев, и всем этим объектам требуются сервисы от главного объекта-менеджера.
Когда я все это делаю руками - получается практически идеально, объекты наследуются от базового, в котором есть ссылка на объект-владелец, и ссылка на объект-менеджер и есть фабрика, их создающая и проставляющая все эти ссылки, т.е. объект в кривом состоянии(с неназначенными ссылками) обычно не бывает.
Это все внутри слоя бизнес-логики, без всяких UI, а взаимодействие с базой данных делается вручную, тупым вызовом запросов из кода менеджера объектов.
Но вот сейчас решил поиспользовать NHibernate и генератор UI для объектов и выползли ЧЕРВИ. В частности, черви того плана, что назначить объект-менеджер и объект-владелец уже так просто не получится - эти объекты либо создаются в дебрях NHibernate либо в дебрях моего генератора, которые знать не знают и знать не хотят о окружении объекта.
Причем в экстремальных случаях задача такая: "объект копируется в виде xml в клипбоард" и потом "объект вставляется из клипбоарда в другом экземпляре программы". Обычный юзкейс - изредка перенести некий сложный объект из одной базы в другую.
Пока это все обходится безумными спагетти из интерфейсов, но обобщить до чего-то более менее вменяемого не получается, выглядит как печальное повторение на нескольких уровнях структурно одинакового кода, формальное назначение которого "проставить ссылки на окружение" и "проставить ссылку на объект владелец".
Частично помогает NHibernate - IInterceptor вставляет объекту ссылку на окружение в OnLoad. Но для объектов типа value внутри коллекций это не помогает - OnLoad вызывается только для Entity. В генераторе же UI приходится плясать с бубенцами самостоятельно, передавая контекст действий во все методы:)
Суть примерно такая: есть некий общий объект-менеджер, хранящий внутри себя общие сервисы, типа "запись в лог" "доступ к бд" "кэш вспомогательных объектов" и есть иерархия-дерево рабочих объектов, каждый из которых содержит одну-две-несколько коллекций подчиненных объектов, те в свою очередь свои подчиненные, итд.
Подчиненным объектам иногда требуются сервисы от их владельцев, и всем этим объектам требуются сервисы от главного объекта-менеджера.
Когда я все это делаю руками - получается практически идеально, объекты наследуются от базового, в котором есть ссылка на объект-владелец, и ссылка на объект-менеджер и есть фабрика, их создающая и проставляющая все эти ссылки, т.е. объект в кривом состоянии(с неназначенными ссылками) обычно не бывает.
Это все внутри слоя бизнес-логики, без всяких UI, а взаимодействие с базой данных делается вручную, тупым вызовом запросов из кода менеджера объектов.
Но вот сейчас решил поиспользовать NHibernate и генератор UI для объектов и выползли ЧЕРВИ. В частности, черви того плана, что назначить объект-менеджер и объект-владелец уже так просто не получится - эти объекты либо создаются в дебрях NHibernate либо в дебрях моего генератора, которые знать не знают и знать не хотят о окружении объекта.
Причем в экстремальных случаях задача такая: "объект копируется в виде xml в клипбоард" и потом "объект вставляется из клипбоарда в другом экземпляре программы". Обычный юзкейс - изредка перенести некий сложный объект из одной базы в другую.
Пока это все обходится безумными спагетти из интерфейсов, но обобщить до чего-то более менее вменяемого не получается, выглядит как печальное повторение на нескольких уровнях структурно одинакового кода, формальное назначение которого "проставить ссылки на окружение" и "проставить ссылку на объект владелец".
Частично помогает NHibernate - IInterceptor вставляет объекту ссылку на окружение в OnLoad. Но для объектов типа value внутри коллекций это не помогает - OnLoad вызывается только для Entity. В генераторе же UI приходится плясать с бубенцами самостоятельно, передавая контекст действий во все методы:)
no subject
Date: 2008-04-04 07:34 pm (UTC)AppContext context = AppContext.getInstance();
Logger logger = context.getLogger();
BeanFactory beanFactory = context.getFactory();
разумеется желательно, чтобы объекты были потокобезопасными.
no subject
Date: 2008-04-04 07:43 pm (UTC)no subject
Date: 2008-04-04 07:54 pm (UTC)