2010-10-21 71 views
0

考虑下面的工厂方法,该方法需要一些元数据并创建相关类型的列。C#工厂问题

它的一切都很好,直到遇到依赖于一些附加数据(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

将函数重载到需要附加参数的函数中。

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

如果你想更好的解决方案,我会确定建议使用这里的Visitor Pattern让每一个具体ColumnMetaData(如等级,日期,下拉等)决定做什么,当谈到创建与编辑建造者。它还将帮助您满足一些非功能性需求,例如可扩展性和可管理性。