2009-03-19 2 views
3

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

В моей системе у меня есть перечисление с 250 членами [один член представляет собой отдельный снимок]. Чтобы заполнить выпадающие списки в любом окне, эта форма отправляет в элементы перечисления, которые связаны с необходимыми выпадающими списками, и выпадающая информация возвращается.

Другими словами, скажем, например, у нас есть 3 окна. Окно A имеет выпадающие точки X, Y и Z. Окно B имеет выпадающие списки W, X и Y, а окно C имеет выпадающие списки T, U и W. Мое перечисление DropDownType будет состоять из T, U, W, X, Y, Y , и Z. Поэтому для указанного окна, учитывая выпадающие окна в этом окне, я запрашиваю, чтобы данные отображались в этих выпадающих списках.

Это упрощенный пример, потому что мое приложение состоит из> 250 отдельных выпадающих списков.

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

switch (dropDownType) 
    { 
     case DropDownType.T: 
      return (from t in dataContext.GetTable<TableOne>() 
        select new DropDownDto 
           { 
            DropDownDisplayName = t.ColumnA, 
            DropDownValue = t.ColumnB 
           }).ToList(); 
     case DropDownType.U: 
      return (from u in dataContext.GetTable<TableTwo>() 
        select new DropDownDto 
           { 
            DropDownDisplayName = u.ColumnC, 
            DropDownValue = u.ColumnD 
           }).ToList(); 
     // etc... 
    } 

Поскольку у меня так много членов в этом перечислении, знает ли кто-нибудь более элегантный способ кодирования этого? Как вы думаете, было бы полезно преобразовать это в заводские методы (но тогда нам придется беспокоиться о 250 отдельных файлах в нашем источнике ...)? Есть ли другой образец, который более полезен? Просто наличие этого оператора HUGE становится неуправляемым.

Любая помощь очень ценится. Заранее спасибо!

ответ

4

Вы можете создать Dictionary<DropDownType, DropDownDtoDelegate> с каждой записью, содержащей запись перечисления в качестве ключа и делегата для извлечения выпадающих данных в качестве значения. Это позволит вам сохранить каждый метод, который возвращает выпадающий список отдельно и из огромного оператора switch. Затем у вас будет один метод для получения делегата, его выполнения и возврата данных выпадающего списка.

1

Есть некоторые решения таких проблем.

  1. Вы можете использовать словарь для отображения из раскрывающихся списков в свои данные.

  2. Вы можете даже рассмотреть возможность перемещения этих данных сопоставления в базу данных. Объем данных может привести к этому решению.

  3. Чтобы удалить дополнительные ключи в форме вашего enum, подумайте об использовании имен выпадающих списков в качестве ключа.

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

Back to Basics - Life After If, For and Switch - Like, a Data Structures Reminder

0

Одним из вариантов может быть использование отражения для обработки значение перечисления. Если у вас есть согласованный стандарт именования для всех участвующих классов, может быть способ динамически генерировать имя таблицы/коллекции для запроса и имя возвращаемого DTO. Для его работы потребуется немного «служебного» кода, но как только вы это сделаете, он потенциально может работать для всех разных таблиц.

0

Я бы использовал DynamicMethod для генерации кода во время выполнения для каждого элемента в перечислении. Это должно быть кэшировано в словаре и генерироваться по требованию.

С атрибутом вы можете установить Entity, используемое для каждого перечисления, и те 2 свойства, которые необходимы.

Я могу себе представить что-то вроде этого.

enum DropDownType 
{ 
    [Configuration(Type = typeof(TableOne), DisplayNameProperty = "ColumnA", ValueProperty = "ColumnB")] 
    T, 

    [Configuration(Type = typeof(TableTwo), DisplayNameProperty = "ColumnC", ValueProperty = "ColumnD")] 
    U 
} 

Если у вас есть значение перечисления, вы проверяете словарь для кэшированных метода, если нет, то создать его.

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

Смежные вопросы