2013-02-20 63 views
2

Fluent接口的基本特徵之一是傳統上將被聲明爲void的方法將返回可用的東西,通常是它們所屬的類的實例(即,this)。 StringBuilder的體現了這個慣例,雖然它不是完全-SE流利,但它給你鏈接的方法方便調用:生成性工具生成流利等價的非流利類?

sb.Append("Foo") 
    .Append("Bar") 
    .AppendLine(); 

System.Web.Mvc.TagBuilder,但是,不遵循這個慣例;方法都是void

一個快速和骯髒的方式來整理這件事可能是在FluentTagBuilder類來封裝私人TagBuilder(_instance),然後實現所有相同的方法,但工作委託給該實例,並返回this而不是void

什麼是最好的不那麼快速和骯髒的方式來實現這一目標?繼承顯然不會這樣做,因爲方法只會因返回類型而異。如果可能的話,我寧願保持簡單,不涉及模擬/替代框架。感謝您分享的任何智慧!

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-02-20 22:59:22

+0

@JohnSaunders,謝謝。我不同意共識(標籤中的前導關鍵字可以更容易地告訴哪個瀏覽器選項卡是哪個,哪個搜索結果最有可能擁有我想要的內容等);那就是說,既然那裏已經達成了共識,我將從現在開始嘗試遵守它。 :) – 2013-02-21 15:10:05

+1

最受歡迎的標籤被添加到標題。他們已經想到了。 – 2013-02-21 15:15:59

回答

1

我剛剛創建了一個小的Git倉庫,併爲這樣開始的工具。

這是非常業餘,嚴重編碼,並有很多問題是的,但你很簡單,你可以適應它。

Fluentizer抓取一個類,並通過反射生成一個新類,封裝原始方法。

檢查Fluentizer在這裏。

+0

我喜歡它;它完成了工作。我只看到兩個容易糾正的問題: * A)*原始靜態方法應聲明爲靜態* B)*'return _this;'返回封裝的(非流暢的)實例。你實際上想要「回過頭來」,以保持流暢。 除此之外,做得好......它完全可用。如果我要加強它,我只會使用一個參數來使類名稱流暢化,其餘的使用''using'塊中的名稱空間的參數 - 甚至可以給它一個交互模式,並帶有提示符你可以設置這些。 – 2013-02-21 14:31:28

+1

是的,我正在將它生成爲擴展方法,然後我立即更改它,現在已經更正。這將是很好,如果它是一些插件,我會看看它,當我有更多的時間 – RMalke 2013-02-21 21:25:31

+0

隨着更正這正是我需要的。謝謝! – 2013-02-21 22:33:15

2

您可以創建一個擴展方法來傳播生成器對象:

public static T Do<T>(this T obj, Action<T> action) 
{ 
    action(obj); 
    return obj; 
} 

TagBuilder builder; 
builder.Do(b => b.SetInnerText("text")) 
     .Do(b => b.AddCssClass("class")) 
     .Do(b => b.GenerateId("id")); 
+0

我自己就是從這個方向開始的,但是我最終需要比我想要替換的原始方法調用更多的語法。 :)我沒有找到解決辦法,沒有封裝和委託給實用程序類。 – 2013-02-21 15:05:04