为什么要使用Fluent界面?

时间:2009-12-30 10:39:50

标签: c# fluent-interface

与传统属性相比,使用它有什么好处?

我知道实例名称的重复已经消失,但这就是全部?

public class PropClass
{
  public Object1 object1 { get; set; }
  public Object2 object2 { get; set; }
}

PropClass propClass = new PropClass();
propClass.object1 = o1;
propClass.object2 = o2;

public class FluentClass
{
    public Object1 object1 { get; private set; }
    public Object2 object2 { get; private set; }

    public FluentClass SetObject1(Object1 o1)
    {
        object1 = o1;
        return this;
    }

    public FluentClass SetObject2(Object1 o2)
    {
        object1 = o2;
        return this;
    }
}

FluentClass fluentClass = new FluentClass().SetObject1(o1).SetObject1(o2);

4 个答案:

答案 0 :(得分:6)

恕我直言,使用流畅的界面设置属性并没有什么大的收获,尤其是使用C#3.0类初始化程序。当您开始链接方法和操作时,Fluent界面会变得更有趣。

答案 1 :(得分:2)

这取决于它的使用方式。在您的示例中,使用流畅的界面没有多大意义。

另一方面,流畅的界面非常适合建筑工人,特别是当您将多个流利的建筑商连接在一起时(例如汽车制造商/发动机制造商)。我已经非常广泛地使用Test Data Builders并且它们工作得非常好。你可以在没有流畅界面的情况下做同样的事情,但使用它并不是那么好。

此外,Martin Fowler explains here还有域特定语言角度。

唯一的问题是人们有时会因为流畅的界面而变得有点疯狂并且创建过于冗长的API,但在我看来,这不是一个流畅的界面问题,而是更多的应用程序/实现问题。

答案 2 :(得分:2)

当您希望减少代码重复并减少每个类之间的依赖性时,Fluent模式(Builder)将是最佳的好处。对于C#3.5+,您可以通过创建方法扩展(如LINQ或以下代码)来创建流畅模式。

public BaseControl
{
    public void RenderControl(HTMLWriter writer) {}
}

public TextBox : BaseControl
{
    public string Text { get;set; }
}

public static T TabIndex<T>(this T control, int index) where T : BaseControl {}

获得上述代码后,可以使用TabIndex设置所需的选项卡索引控件。

BaseControl control1 = new BaseControl();
control1.TabIndex(1);

// Moreover, you can use this for any devired controls like this
TextBox control2 = new TextBox()
{
    Text = "test"
};

// The following method still return TextBox control.
control2.TabIndex(2);

如您所见,您可以减少BaseControl类不必要的代码。但你可以像我展示的那样改变它。这个概念适用于很多具有高耦合率的类。

顺便说一句,我喜欢这种模式,因为它使我的代码易于阅读,如下面的代码。

var pmLogOnName = Html.CreatePopUpMenu("pmLogOnName")
                      .AddMenuItem("mLogOnName-RememberMe", "Remember UserName", isCheckBox: true, isSelected: true);

Html.CreateTextBox("txtLogOnName", 1)
    .BindData(Model, x => x.LogOnName, "showError")
    .WaterMark(LogOnView.LogOnName)
    .BindMenu(pmLogOnName)

答案 3 :(得分:0)

在我看来,没有一个很大的优势,或者像上面那样的简单类(具有一些属性的类)。这是一些开发人员一方面习惯的不同语义。另一方面,我认为它在ASP.NET MVC等某些领域非常有利......我使用了Telerik MVC控件,它使用了流畅的界面,设置控件非常好用; MS方式需要使用集合和匿名类,并且使用起来不太方便。

HTH。