2010-10-21 6 views
0

Considérons la méthode d'usine ci-dessous qui prend quelques méta-données et crée une colonne du type approprié.C# question d'usine

Tout est bon jusqu'à ce que je rencontre une colonne qui repose sur des données supplémentaires (ColumnType.DropDownList). Cela nécessite des données supplémentaires (une liste de valeurs) à des fins d'affichage.

Je ne souhaite pas fournir ces données au niveau des méta-données, ce qui me semble logique lorsqu'un objet est créé en usine. Mais je me bats pour une manière élégante d'obtenir la liste dans la méthode d'usine (VOIR COMMENTAIRE: ne peux pas être HARDCODED ICI!)

Des idées? Je suis ouvert à tout!

 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); 
    } 

Répondre

2

Surcharge la fonction avec une fonction qui prend un paramètre supplémentaire.

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

Si vous voulez une solution beaucoup plus élégante, je opterai suggère d'utiliser le Visitor Pattern ici pour laisser tous les ColumnMetaData concrets (comme Rank, date, DropDown etc.) décider quoi faire quand il vient de créer un éditeur avec le constructeur. Il vous aidera également à répondre à certaines exigences non fonctionnelles telles que l'extensibilité et la facilité de gestion.