2009-09-19 3 views
5

Я создаю поисковое приложение, которое проиндексировало несколько разных источников данных. Когда запрос выполняется против индекса поисковой системы, каждый результат поиска указывает, из какого источника данных он пришел. Я построил шаблон фабрики, который я использовал для отображения другого шаблона для каждого типа результата поиска, но я понял, что этот шаблон станет более сложным для управления, поскольку все больше источников данных индексируются поисковой системой (то есть новые шаблон кода должен быть создан для каждого нового источника данных).C# Factory Pattern

Я создал следующую структуру для моей фабрики, основанной прочь статьи Гранвиля Barnett над на DotNetSlackers.com

factory pattern http://img11.imageshack.us/img11/8382/factoryi.jpg

Для того, чтобы сделать этот поиск проще в обслуживании, моя мысль была создать набор таблиц базы данных, которые могут использоваться для определения отдельных типов шаблонов, которые мой заводский шаблон мог ссылаться, чтобы определить, какой шаблон нужно построить. Я решил, что мне нужно будет найти таблицу поиска, которая будет использоваться для указания типа шаблона для построения на основе источника данных результата поиска. Затем мне понадобится таблица (таблицы), чтобы указать, какие поля будут отображаться для этого типа шаблона. Мне также понадобится таблица (или дополнительные столбцы в таблице шаблонов), которые будут использоваться для определения способа отображения этого поля (например, гиперссылки, метки, CssClass и т. Д.).

Есть ли у кого-нибудь примеры такого шаблона? Пожалуйста, дайте мне знать. Спасибо, -Robert

ответ

4

Я бы предложил, чтобы это предлагаемое решение было не менее ремонтопригодным, чем просто сопоставление источника данных с шаблоном кода, как и сейчас. Фактически, я бы даже зашел так далеко, чтобы сказать, что вы потеряете гибкость, нажав схему шаблона и визуализируя информацию в базу данных, что сделает ваше приложение сложнее поддерживать.

Например, давайте предположим, что у вас есть эти источники данных с атрибутами (если я правильно понять это):

Document { Author, DateModified } 
Picture { Size, Caption, Image } 
Song { Artist, Length, AlbumCover } 

Вы тогда можете иметь один из каждых из этих источников данных в результатах поиска. Каждый элемент визуализируется по-разному (изображение может отображаться с предварительным изображением, закрепленным слева, или песня может отображать обложку альбома и т. Д.)

Давайте просто посмотрим на рендеринг по вашему предлагаемому дизайну. Вы собираетесь запросить базу данных для рендеринга, а затем скорректируйте некоторый HTML, который вы используете, например, потому что вам нужен зеленый фон для документов и синий для Картин. Допустим, вы понимаете, что вам действительно нужны три цвета фона для песен, два для Картинков и один для документов. Теперь вы просматриваете изменение схемы базы данных, которое продвигается и вытесняется, в дополнение к изменению параметризованного шаблона, к которому вы применяете значения рендеринга.

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

Вот как разрывается дизайн, поскольку теперь вы потеряли гибкость определить разные шаблоны на источник данных. Другая вещь, которую вы теряете, заключается в том, чтобы ваши шаблоны были версией в исходном элементе управления.

Я хотел бы посмотреть, как вы можете повторно использовать общие элементы/элементы управления в своих испущенных представлениях, но сохраняйте соответствие между фабрикой между шаблоном и источником данных и сохраняйте шаблоны в виде отдельных файлов на каждый источник данных.Посмотрите на поддержку рендеринга через CSS или аналогичные параметры конфигурации. Для упрощения его обслуживания, рассматривая возможность экспорта отображений в виде простого XML-файла. Чтобы развернуть новый источник данных, вы просто добавляете сопоставление, создаете соответствующий шаблон и файл CSS и переносите их в ожидаемые местоположения.

Ответ на комментарии ниже:

Я имел в виду простое утверждение переключателя должно быть достаточно:

switch (resultType) 
{ 
    case (ResultType.Song): 
     factory = new SongResultFactory(); 
     template = factory.BuildResult(); 
     break; 
    // ... 

Где есть логика для вывода заданного шаблона. Если вы хотите что-то более компактное, чем длинное заявление переключателя, вы можете создать отображения в словаре, например:

IDictionary<ResultType, ResultFactory> TemplateMap; 
mapping = new Dictionary<ResultType, ResultFactory>(); 
mapping.Add(ResultType.Song, new SongResultFactory()); 
// ... for all mappings. 

Тогда вместо переключателя заявления, вы можете сделать это один вкладыш:

template = TemplateMap[resultType].CreateTemplate(); 

Мой главный аргумент заключался в том, что в какой-то момент вам все равно придется поддерживать сопоставления - либо в базе данных, либо в большом операторе switch, либо в экземпляре IDictionary, который необходимо инициализировать.

Вы можете взять его дальше и хранить отображения в простом файле XML, который читают в:

<TemplateMap> 
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" /> 
    <!-- ... --> 
</TemplateMap> 

и использование отражения эт. и др. для заполнения IDictionary. Вы по-прежнему поддерживаете сопоставления, но теперь в XML-файле, который может быть проще развернуть.

+0

Еще раз спасибо за объяснение. Всегда приятно получить еще один взгляд и взгляды! Ваши мысли дали мне еще несколько идей для рассмотрения. Еще раз спасибо. - Роберт –