C# 如何确保fluent API中方法的顺序?

C# 如何确保fluent API中方法的顺序?,c#,fluent,fluent-interface,C#,Fluent,Fluent Interface,我想为我正在构建的一些类创建一个流畅的接口,作为框架的一部分。我已经创建了这些方法,并且能够成功地链接这些方法。现在我想确保我可以处理不正确的方法调用序列 我正在做的事情类似于CreateWorkflow->OpenConfiguration->ChangeUserName 在上面的场景中,如果首先调用ChangeUserName,则没有意义,因为它依赖于OpenConfiguration 我不知道我是否正确地为这个场景创建了一个流畅的方法链,以及如何使序列工作。对我来说,这个场景似乎非常适合创

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

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


我不知道我是否正确地为这个场景创建了一个流畅的方法链,以及如何使序列工作。对我来说,这个场景似乎非常适合创建fluent API。

真正的关键是,如果您需要一个特定的序列,fluent API才能正常工作,那么您的API需要改进。也许你应该考虑一些不同的东西。如果ChangeUserName需要OpenConfiguration,则API的使用者不应在意。将依赖项内部化,使API成为:

创建工作流->更改用户名

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

CreateWorkflow(IConfigurationManager)->ChangeUserName

CreateWorkflow->ChangeUserName(IConfigurationManager)

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


希望这有帮助。

以下是按特定顺序强制执行方法链的示例代码。我使用了来自的示例,并修复了原始代码中的一个小问题。是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
    }
}

似乎我们可以使用这里提到的接口来实现我想要的,但这对我来说似乎是一种过分的手段。这个问题还有其他更好的解决方案吗?你必须澄清“更好”的含义。有几个接口看起来并不可怕。如果你的目标是编译时检查(这在这里是一个完全合理的目标),在我看来,你要么为同一个核心类使用不同的接口,要么让每个链式方法返回完全不同的类。类型系统是OO语言为强制执行这些类型的编译时约束所提供的。@joshtkling是的,你是对的,我正在寻找一种编译时检查的方法,理想情况下,我希望用户在intellisense中只有有效的选项。@48klocs我正在考虑我最终将拥有多少类或接口,我认为如果我采用使用接口和类的方式,它们的数量不会太少。我在想也许有一些最佳实践/方法可以做到这一点?