进展流畅的界面如何在开始时隐藏所有方法?

时间:2012-05-28 05:28:34

标签: c# fluent-interface

尝试创建一个简单的noddy示例,以便我可以使用流畅的接口构建我的下一个项目。 我需要为我的dll用户提供一个直观的逐步构建类的方法。

问题。 我希望用户只在第一次启动时看到Initialise,然后是step1,然后是step2 然后结束?我该怎么做?

这是我的尝试,只要你把“。”你看到了一切,然后隐藏起来。

class Program
{
    static void Main(string[] args)
    {
        IEnd builder = new StepBuilder()
            .Initialize()
            .LoadStuff()
            .Validate()
            .End();

    }
}
 public class StepBuilder : IInitialize,
                              IStep1,
                              IStep2,
                              IStep3,
                              IEnd
 {
     public IStep1 Initialize()
     {
         return this;
     }

     public IStep2 LoadStuff()
     {
         return this; ;
     }

     public IStep3 Validate()
     {
         return this;
     }

     public IEnd End()
     {
         return this;
     }

     public bool Save()
     {
         return true;
     }
 }

public class Step
{
    public string Name { get; set; }
    public string Category { get; set; }
    public decimal Price { get; set; }
}

public interface IInitialize
{
    IStep1 Initialize();
}

public interface IStep1 
{
    IStep2 LoadStuff();
}

public interface IStep2 
{
    IStep3 Validate ();
}

public interface IStep3
{
    IEnd End();
}
public interface IEnd 
{
    bool Save();
}

}

关于构建渐进式流畅界面的任何建议或良好链接?

1 个答案:

答案 0 :(得分:3)

您可以将Initialize()转换为静态工厂方法,并将构造函数设为私有。然后你的创作代码如下:

    IEnd builder = StepBuilder.Initialize()
         .LoadStuff()
         .Validate()
         .End(); 

第二个想法是使接口实现显式化。然后你只会看到你当时正在处理的界面的方法。

<强>更新

这是两种方法的示例代码。接口与您的问题完全相同。

工厂方法示例:

class Program
{
    static void Main(string[] args)
    {
        IEnd builder = StepBuilder
            .Initialize()
            .LoadStuff()
            .Validate()
            .End();

    }
}

public class StepBuilder : IInitialize,
                             IStep1,
                             IStep2,
                             IStep3,
                             IEnd
{
    private StepBuilder()
    {
    }

    public static IStep1 Initialize()
    {
        var builder = new StepBuilder();
        //do initialisation stuff
        return builder;
    }

    public IStep2 LoadStuff()
    {
        return this; 
    }

    public IStep3 Validate()
    {
        return this;
    }

    public IEnd End()
    {
        return this;
    }

    public bool Save()
    {
        return true;
    }
}

显式接口实现的示例:

class Program
{
    static void Main(string[] args)
    {
        IEnd builder = new StepBuilder()
            .Initialize()
            .LoadStuff()
            .Validate()
            .End();

    }
}

public class StepBuilder : IInitialize,
                             IStep1,
                             IStep2,
                             IStep3,
                             IEnd
{
    public IStep1 Initialize()
    {
        return this;
    }

    public IStep2 IStep1.LoadStuff()
    {
        return this; 
    }

    public IStep3 IStep2.Validate()
    {
        return this;
    }

    public IEnd IStep3.End()
    {
        return this;
    }

    public bool IEnd.Save()
    {
        return true;
    }
}