2010-10-21 64 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(如等級,日期,下拉等)決定做什麼,當談到創建與編輯建造者。它還將幫助您滿足一些非功能性需求,例如可擴展性和可管理性。