Я бы предложил, чтобы это предлагаемое решение было не менее ремонтопригодным, чем просто сопоставление источника данных с шаблоном кода, как и сейчас. Фактически, я бы даже зашел так далеко, чтобы сказать, что вы потеряете гибкость, нажав схему шаблона и визуализируя информацию в базу данных, что сделает ваше приложение сложнее поддерживать.
Например, давайте предположим, что у вас есть эти источники данных с атрибутами (если я правильно понять это):
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-файле, который может быть проще развернуть.
Еще раз спасибо за объяснение. Всегда приятно получить еще один взгляд и взгляды! Ваши мысли дали мне еще несколько идей для рассмотрения. Еще раз спасибо. - Роберт –