如何在流畅的接口的方法调用中构建序列

时间:2011-02-24 15:20:26

标签: c# dsl fluent fluent-interface

您好我想构建一个流畅的界面,用于创建某种工厂或构建器的对象。

我知道我必须“返回此”以使方法可链接。

public class CarBuilder
{

   public  CarBuilder()
   {
       car = new Car();
   }
    private Car car;

    public CarBuilder AddEngine(IEngineBuilder engine)
    {
        car.Engine = engine.Engine();
        return this;
    }

    public CarBuilder AddWheels(IWheelsBuilder wheels)
    {
        car.Wheels = wheels.Wheels();
        return this;
    }
    public CarBuilder AddFrame(IFrameBuilder frame)
    {
        car.Frame = frame.Frame();
        return this;
    }

    public Car BuildCar()
    {
        return car;
    }

}

有了这个,我可以建造一辆这样的车:

 Car c = builder.AddFrame(fBuilder).AddWheels(wBuilder).AddEngine(eBuilder).BuildCar();

但我需要的是一个特殊的序列或工作流程: 我只能在车架顶部制造车轮,当车轮存在时,我将能够建立发动机。 所以我没有提供汽车制造商的每一种方法,而是希望能够只将框架添加到构建器中,然后只将框架添加到框架中,然后将引擎添加到框架之上......

如果EngineBuilder本身具有流畅的api,如eBuilder.Cylinders(12).WithPistons()....

,它会是多么好或者什么是好的实现?

是否有可能有这样的东西

Car c = builder.AddFrame(fBuilder).AddWheels(wBuilder).AddEngine(x=>x.WithCylinders(12).WithPistons()).BuildCar();

总结如何构建流畅界面的流程以及如何嵌套流畅的界面?

2 个答案:

答案 0 :(得分:0)

那么AddWheels不是属于Frame的方法吗?您还可以考虑在请求无效操作时抛出异常,例如添加没有框架的轮子。

答案 1 :(得分:0)

不是只有一个暴露所有方法的CarBuilder类,而是有多个类,每个类只公开适用于" state"的方法。正在建造的汽车。

根据您的示例,CarBuilder仅提供AddFramethis不返回AddFrame,而是返回仅提供CarBuilderWithFrame的类AddWheels的对象,该对象返回仅提供{{1}的类CarBuilderWithFrameAndWheels的对象}},返回仅提供AddEngine的类CarBuilderWithEverything的对象。

这个例子是非常连贯的,你可以争论是否有必要为这样一个线性过程完成这么多工作。

我喜欢的一个例子就是打印。 Printer对象可以返回提供三种方法的PrintJob对象:Cancel,Print或StartPage。 StartPage方法将返回一个Page对象,该对象为您提供所有绘图命令的方法,一个名为EndPage的绘图命令可以返回PrintJob对象。这样可以轻松地对简单的打印作业进行硬编码。

Build