0

我一直在努力 ( http://tinyurl.com/m4hzjb ) 使用这个 Fluent API 来实例化 ASP.NET 控件,并且觉得我现在有一些看起来运行良好的东西。我正在寻找一些反馈和意见......好的,坏的或冷漠的。你会觉得这有用吗?您预见到的任何技术问题?改进空间?

这是创建标准 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 类。

建造者

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) { }
}
4

2 回答 2

3

I question the need here. To me, this:

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

Is far less clear than:

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

What is Factory? What happens if we forget the "RenderTo" line?

The first is not nearly as obvious to me, and going to be less maintainable, since it would be very difficult to extend this for custom controls (where you don't know the properties in advance), etc.

于 2009-09-01T18:07:10.657 回答
0

我喜欢 Fluent API 的工作方式,这可能是配置动态控件的好方法。

我有以下几点:

  • Fluent API 风格就是这样,一种风格。它完成了与传统函数式编程风格相同的事情,但具有不同的美感。
  • 许多用户只是使用表单设计器来设计控件,这就足够了。除非您在运行时创建控件,否则它不会被大量使用。
  • 除上述内容外,我创建的大多数运行时控件往往都有一些 if-then-else 逻辑。Fluent 风格适用于简单的配置,但在构建过程中有大量逻辑时往往会变得笨拙。
  • 我很难说服自己或团队中的其他架构师相信,除了可读性或风格之外,与传统方法相比,这有任何优势。
  • 最后,我的生产代码将不得不依赖于另一个库,而且您总是很可能引入了错误。

最终,我不得不说你接受这个很好。这是一个很棒的练习,有人可能会使用它。让它开源,几年后它可能会成为标准。

于 2009-09-01T18:42:56.153 回答