2012-09-20 82 views
5

我敢肯定這是一個非常奇怪的要求,但這裏。如何從ASP.NET MVC網站內生成可下載的C#類?

我們有一些客戶配置代碼,由我們編譯到類庫中的C#類表示。創建這些配置類目前是我希望分配給除開發人員以外的其他人的猴子工作。因此,我們構建了一個「配置器」網站,業務分析師可以通過填寫表格並選擇相關選項來生成有效的C#類。

從MVC網站的模板生成C#類的最佳方式是什麼?請注意,我不是在說動態生成並在運行時執行類:我們本質上是生成一個文本文件,它恰好包含將包含在完全不同的項目中的C#代碼。

這被證明是一個非常困難的話題谷歌正確!選項都拿出了那麼遠,

  • 只使用一個標記化的文本文件,並使用的String.Format
  • 替換值
  • 以某種方式使用剃刀作爲一個模板引擎(但不知道怎麼了,它不是HTML我們「重新生成)
  • 以某種方式使用T4模板(至少我知道它是用來生成C#,但不知道如何在運行時執行)

就如何最好地處理這個任何想法?

按照要求,這裏是一個輸出類/文件的例子。這裏的值覆蓋了基類中設置的值,這些值使用特定於客戶的標籤,驗證等。這就是我們如何爲客戶定製產品的方法。

public class AreaRiskTemplate: AreaRiskTemplateBase 
{ 
    public override string EntityName { get { return "risk"; } } 
    public override string EntityNamePlural { get { return "risks"; } } 
    public override string EntityNameArticle { get { return "a"; } } 
    public override string CGovItemRefPrefix { get { return "R"; } } 
    public override void SetFieldDefinitions() 
    { 

     FieldDefinitions.Level1.IsImplemented = true; 
     FieldDefinitions.Level1.Label = "Category"; 
     FieldDefinitions.Level1.IsVisibleInGrid = true; 

     FieldDefinitions.Level2.IsImplemented = true; 
     FieldDefinitions.Level2.Label = "Team"; 
     FieldDefinitions.Level2.IsVisibleInGrid = true; 

     FieldDefinitions.Description.IsImplemented = true; 
     FieldDefinitions.Description.Label = "Description"; 
     FieldDefinitions.Description.IsVisibleInGrid = true; 

    } 
    public override ModelStateDictionary Validate() 
    { 
     var msd = new ModelStateDictionary(); 
     // add template-specific validation here 
     msd.Merge(base.Validate()); 
     return msd; 
    } 
    public override List<string> Level1Options 
    { 
     get 
     { 
      return new List<string> 
       { 
        "Organisational", 
        "Financial", 
        "Operational", 
        "External", 
      "IT" 
       }; 
     } 
    } 
} 

更新:目前正在研究T4模板http://msdn.microsoft.com/en-us/library/ee844259(v=vs.100).aspx(感謝下面的評論)。看起來很有希望。

+1

http://msdn.microsoft.com/en-us/library/bb126445.aspx似乎包含有關在運行時開始使用T4的詳細信息。 –

+0

這也可能是有趣的:http://code.msdn.microsoft.com/windowsdesktop/Single-File-Generator-94d856d4 – Magrangs

+0

你能發佈一個這個配置文件的樣子嗎? –

回答

1

我建議避開網站,而是簡單地使用CodeSmith。您可以設計CodeSmith腳本,以便它會詢問信息並生成所需的代碼。似乎很少工作,雖然你必須購買CodeSmith。

+0

感謝您的建議。我以前使用Codesmith很多。我想我的問題是,在這種情況下,我希望非技術人員輸入允許生成類的數據。然後開發人員將登錄並根據該數據下載課程。 Codemith的範圍很可能在我上次使用它後的5年內發生了變化,但我認爲它缺少輸入界面。 – centralscru

+1

@centralscru - CodeSmith允許您創建一個對話框,該對話框接受用於生成的參數。最終用戶只需運行該腳本,填寫框並單擊確定。然後,您可以將這些生成的類保存到UNC共享中。 –

0

用最少的開銷來做到這一點的方法是使用微軟內置的CodeDOM API。它允許您使用跨語言兼容的文檔對象模型構建和操作CLR代碼文檔。

這種方法唯一的缺點是,如何實現一些特定語言的功能並不明顯。一個示例是C#readonly字段,因爲它們不適用於每種CLR語言,但僅適用於C#。這種特殊複雜性的解決方案是使用CodeSnippet並將手動代碼作爲字符串插入。通過將CodeDOM與模板引擎集成,可以緩解其他更復雜的不匹配問題。奧列格Sych寫道a useful article on integrating CodeDOM with the T4 templating engine。我更喜歡這種純粹的文本生成方法,因爲強類型的文檔對象模型比純文本更容易出錯。另外,如果你曾經想要編譯輸出代碼,CodeDOM API也支持這種方法。

如果這是一種您認爲可能使用很多的做法,則可能需要使用builder pattern將一些常用的DOM操作功能包裝爲流暢的方法調用。我已經建立了一個使用這種方法的個人圖書館,並且通過代碼生成提高了我的工作效率,這非常成功。