Какой шаблон применяется для инкапсуляции «контекстных» запросов? - PullRequest
1 голос
/ 23 февраля 2012

В настоящее время мой проект на работе имеет очень неэффективный цикл, который в значительной степени страдает от проблемы n + 1.(6n + 1, я думаю.) В настоящее время ряд веб-сервисов создает экземпляр объекта, конструктор которого создает каноническое представление одного из наших объектов ORM, - вызывая их Foo и FooView().Есть ряд мест, где собрана коллекция Foo;каждый экземпляр Foo передается в FooView, и его (псевдо) поля внешнего ключа запрашиваются в другой базе данных для построения текстового представления, так что, например, мы можем вернуть <fooColor>Blue</fooColor>а не <fooColor>5</fooColor>.Наборы этих свойств - «Цвета», «Формы» и другие аналогичные общие свойства - относительно невелики и, очевидно, должны быть извлечены в память.

Существует также другой, более сложный запрос, который способствует6n + 1 проблема.Это набор полей метаданных.Каждый Foo имеет Source.Каждый Source может иметь одно, ни одно или несколько полей метаданных, определенных для их подмножества Foos.Пустые теги XML требуются для полей метаданных, которые применяются к данному Foo Source.В настоящее время четыре (!) Запроса ORM (!), Использованные для построения этого XML, находятся внутри конструктора FooView, что означает, что они выполняются для каждого Foo.

Моя цель заключается в следующем:

  1. Запрос общих свойств, таких как Color, Shapes и т. Д., Прежде всего.
  2. Запустите запрос, чтобы сгенерировать коллекцию Foo.Сохраните первичные ключи в списке.
  3. Используя список первичных ключей, запустите ужасный многопользовательский необработанный SQL-запрос для генерации Foo.Metadata.
  4. Вызова FooView, предоставивнабор Foo вместе с объектом контекста, содержащим элементы, встроенные в шаги 1 и 3. FooView обеспечит логику чередования, используя объект контекста, а не поиск в базе данных.

Является ли этоздоровая практика?Это определенно решит некоторые проблемы с производительностью при генерации FooView, но где эта вещь должна жить?Должен ли я назвать это FooHelper?FooContext?FooService?Это шаблон проектирования или я должен его использовать, чтобы сделать его более логичным?

Спасибо!

...