2009-09-01 24 views
0

我一直在努力(http://tinyurl.com/m4hzjb)在這個Fluent API實例化ASP.NET控件,並感覺我現在有東西看起來工作得很好。我在尋找一些反饋和意見......好,壞或無動於衷。你會發現這有用嗎?您預見的任何技術問題?需要改進的地方?C#流利的API用於樓宇控制:需要反饋

這裏是一個用於創建標準TextBox控件的基本用法示例。只有兩個屬性/方法被實現,但是API可以很容易地擴展以支持完整的屬性特徵集合。

用法

Factory.TextBox() 
     .ID("TextBox1") 
     .Text("testing") 
     .RenderTo(this.form1); 

// The above TextBox Builder is functionally same as: 

TextBox textbox = new TextBox(); 
textbox.ID = "TextBox1"; 
textbox.Text = "testing"; 

this.form1.Controls.Add(textbox); 

// Or: 

this.form1.Controls.Add(new TextBox { 
    ID = "TextBox1", 
    Text = "testing" 
}); 

下面是完整的ControlBuilder類。

BUILDER

public partial class Factory 
{ 
    public static TextBoxBuilder TextBox() 
    { 
     return new TextBoxBuilder(new TextBox()); 
    } 
} 

public abstract class ControlBuilder<TControl, TBuilder> 
    where TControl : Control 
    where TBuilder : ControlBuilder<TControl, TBuilder> 
{ 
    public ControlBuilder(TControl control) 
    { 
     this.control = control; 
    } 

    private TControl control; 

    public virtual TControl Control 
    { 
     get 
     { 
      return this.control; 
     } 
    } 

    public virtual void RenderTo(Control control) 
    { 
     control.Controls.Add(this.Control); 
    } 

    public TBuilder ID(string id) 
    { 
     this.Control.ID = id; 
     return this as TBuilder; 
    } 
} 

public abstract class TextBoxBuilder<TTextBox, TBuilder> : ControlBuilder<TTextBox, TBuilder> 
    where TTextBox : TextBox 
    where TBuilder : TextBoxBuilder<TTextBox, TBuilder> 
{ 
    public TextBoxBuilder(TTextBox control) : base(control) { } 

    public TBuilder Text(string text) 
    { 
     this.Control.Text = text; 
     return this as TBuilder; 
    } 
} 

public class TextBoxBuilder : TextBoxBuilder<TextBox, TextBoxBuilder> 
{ 
    public TextBoxBuilder(TextBox control) : base (control) { } 
} 

回答

3

我這裏質疑是否有必要。對我來說,這樣的:

Factory.TextBox() 
    .ID("TextBox1") 
    .Text("testing") 
    .RenderTo(this.form1); 

遠遠小於明確:

this.form1.Controls.Add(new TextBox { 
     ID = "TextBox1", 
     Text = "testing" 
    }); 

是什麼廠?如果我們忘記了「RenderTo」這一行,會發生什麼?

首先是幾乎沒有明顯的我,會是少維護的,因爲這將是非常困難的擴展這個自定義控件(你不知道提前屬性)等

+0

我同意。我也質疑需要。該項目開始時只是試圖弄清楚這種語法糖是否可以用於控制建築。但是,我確實質疑需求以及它是否進一步混淆了事情。 – jlang 2009-09-01 18:31:54

+0

更清晰的爭論只是表達一種偏好。流利就像編碼風格,但我不能說天氣它更具可讀性 – 2009-09-01 18:44:24

+0

@Oplopanax:我同意,這就是爲什麼我明確地將我的陳述冠以「To me」前綴。但是,這不是提供新功能,而是提供不同的編程抽象。任何抽象只能在可讀性,可維護性,性能等方面提供某些明顯的優勢時才被編寫和優先選擇。在這種情況下,我不明白這是如何改進當前接受的實踐。 – 2009-09-01 18:49:23

0

我喜歡Fluent API的工作方式,這可能是配置動態控件的好方法。

,我有以下幾點:

  • 的流暢API的風格就是這樣,一種風格。它實現了與傳統函數式編程風格相同的功能,具有不同的美感。
  • 許多用戶只是使用Forms設計器來設計控件,這就夠了。除非您在運行時創建控件,否則不會使用太多。
  • 除此之外,我創建的大多數運行時控件都傾向於使用if-then-else邏輯。 Fluent風格適用於簡單的配置,但在構建過程中存在大量邏輯時往往會變得笨拙。
  • 我很難說服自己或團隊中的其他架構師,除了傳統方法的可讀性或風格之外,這有其他優點。
  • 最後,我的生產代碼將不得不依賴於另一個庫,並且總是有可能引發錯誤的遠程機會。

最終,我必須說你對此有好處。這是一個很好的練習,有人可以使用它。讓它成爲開源的,並在幾年內成爲標準。