C # фабричный вопрос - PullRequest
       1

C # фабричный вопрос

0 голосов
/ 22 октября 2010

Рассмотрим метод фабрики, приведенный ниже, который берет некоторые метаданные и создает столбец соответствующего типа.

Все хорошо, пока я не столкнусь со столбцом, который опирается на некоторые дополнительные данные (ColumnType.DropDownList).Для отображения нужны дополнительные данные (список значений).

Я не хочу предоставлять эти данные на уровне метаданных, поэтому предоставление их при создании объекта на фабрике представляется разумным.Но я борюсь за элегантный способ получить список в заводской метод (СМ. КОММЕНТАРИЙ: НЕ СМОЖЕТ БЫТЬ ЗДЕСЬ ЗДЕСЬ !!!)

Есть идеи?Я открыт для любого!

     public static DetailEditorColumn<int> Create(ColumnMetaData metaData)
    {
        if (metaData.ColumnType == ColumnType.Rank)
        {
            return GridColumnBuilder<int>.GetRankColumn(metaData.DisplayOrder, metaData);
        }

        if (metaData.ColumnType == ColumnType.Decision)
        {
            return GridColumnBuilder<int>.GetDecisionColumn(metaData.DisplayOrder, metaData);
        }

        if (metaData.ColumnType == ColumnType.Date)
        {
            return GridColumnBuilder<int>.GetDateColumn(metaData.DisplayOrder, metaData);
        }

        if (metaData.ColumnType == ColumnType.DropDownList)
        {
            // TODO where the humf should this get plugged in!
            // cant BE HARDCODED HERE!!!
            DropDownList lookupList = new DropDownList()
            {
                new DropDownListOption() { Id = 1, Value = "Entry 1", ParenTId = null }, 
                new DropDownListOption() { Id = 2, Value = "Entry 1", ParenTId = null }, 
                new DropDownListOption() { Id = 3, Value = "Entry 1", ParenTId = null }
            };

            return GridColumnBuilder<int>.GetDropDownListColumn(metaData.DisplayOrder, metaData, lookupList);
        }

        throw new Exception("Column Type Not Supported " + metaData);
    }

Ответы [ 2 ]

2 голосов
/ 22 октября 2010

Перегрузите функцию той, которая принимает дополнительный параметр.

public static DetailEditorColumn<int> Create(ColumnMetaData metaData, List<T> lookupList)
{
    //what is coded above
    if (metaData.ColumnType == ColumnType.DropDownList)
    {
        if (lookupList == null)
            //handle error
        else
            return GridColumnBuilder<int>.GetDropDownListColumn(metaData.DisplayOrder, metaData, lookupList);
    }
}

public static DetailEditorColumn<int> Create(ColumnMetaData metaData)
{
    return ClassName.Create(metaData, null);
}
1 голос
/ 22 октября 2010

Если вы хотите гораздо более элегантное решение, я бы определенно предложил использовать Шаблон посетителя здесь, чтобы каждый конкретный ColumnMetaData (например, Rank, Date, DropDown и т. Д.) Решал, что делать, когда дело доходит до созданияредактор со строителем.Это также поможет вам выполнить некоторые нефункциональные требования, такие как расширяемость и управляемость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...