C# 如何确保fluent API中方法的顺序?
我想为我正在构建的一些类创建一个流畅的接口,作为框架的一部分。我已经创建了这些方法,并且能够成功地链接这些方法。现在我想确保我可以处理不正确的方法调用序列 我正在做的事情类似于CreateWorkflow->OpenConfiguration->ChangeUserName 在上面的场景中,如果首先调用ChangeUserName,则没有意义,因为它依赖于OpenConfigurationC# 如何确保fluent API中方法的顺序?,c#,fluent,fluent-interface,C#,Fluent,Fluent Interface,我想为我正在构建的一些类创建一个流畅的接口,作为框架的一部分。我已经创建了这些方法,并且能够成功地链接这些方法。现在我想确保我可以处理不正确的方法调用序列 我正在做的事情类似于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我正在考虑我最终将拥有多少类或接口,我认为如果我采用使用接口和类的方式,它们的数量不会太少。我在想也许有一些最佳实践/方法可以做到这一点?