如何在流畅的API中确保方法的顺序?

时间:2014-07-29 15:28:02

标签: c# fluent fluent-interface

我想为我作为框架的一部分构建的一些类创建流畅的界面。我已经创建了方法,我能够成功地链接方法。现在我想确保我可以处理不正确的方法调用序列。

我正在做的事情就像CreateWorkflow - > OpenConfiguration - > ChangeUserName 在上面的场景中,如果首先调用ChangeUserName是没有意义的,因为它依赖于OpenConfiguration。

我很困惑我是否正确为这种情况创建Fluent方法链以及如何使序列工作。对我来说,这种情况似乎非常适合创建流畅的API。

2 个答案:

答案 0 :(得分:1)

以下是按特定顺序强制执行方法链的示例代码。我使用了here中的示例并修复了原始代码中的小问题。 Here是dotnet fiddler中正在运行的代码

public interface IName
{
    IAge WithName(string name);
}

public interface IAge
{
    IPersist WithAge(int age);
}

public interface IPersist
{
    void Save();
}

public class Person : IName, IAge, IPersist
{
    public string Name { get; private set; }
    public int Age { get; private set; }


    public IAge WithName(string name)
    {
        Name = name;
        return this;
    }

    public IPersist WithAge(int age)
    {
        Age = age;
        return this;
    }

    public void Save()
    {
        // save changes here
    }
}

答案 1 :(得分:0)

真正的关键是,如果您需要特定的序列来使用流畅的API来帮助您改进API需求。也许你应该考虑一些不同的东西。如果ChangeUserName需要OpenConfiguration,则API的使用者不应该关心。要么内部化依赖关系,要么API变为:

CreateWorkflow - > ChangeUserName

或者如果消费者已经拥有配置对象,您可以使用依赖注入方法并使API类似于:

CreateWorkflow(IConfigurationManager) - > ChangeUserName

CreateWorkflow - > ChangeUserName(IConfigurationManager)

我在这里展示了两种方法,因为我不确定您的配置类的依赖范围是什么。通过内化需求或在其中一个方法的签名上添加必需参数,您应该能够消除固定序列问题。除了明确的“开始”和“完成”API之外。

希望这有帮助。