【问题标题】:How to ensure the sequence of methods in fluent API?如何保证 Fluent API 中方法的顺序?
【发布时间】:2014-09-21 01:12:41
【问题描述】:

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

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

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

【问题讨论】:

  • 似乎我们可以使用这里提到的接口实现我想要的目标stackoverflow.com/questions/17800706/…,但这对我来说似乎有点过头了。这个问题还有其他更好的解决方案吗?
  • 您将不得不澄清“更好”的含义。使用一些界面似乎并不那么可怕。
  • 如果您的目标是编译时检查(这是一个完全合理的目标),在我看来,您要么对同一个核心类使用不同的接口,要么让每个链接的方法返回完全不同的班级。类型系统是 OO 语言为强制执行这些类型的编译时约束而提供的。
  • @joshtkling 是的,你是对的,我正在寻找一种编译时检查的方法,理想情况下我希望用户在智能感知中只有有效的选项。
  • @48klocs 我在想我最终会有多少个类或接口,如果我走使用接口和类的路线,我认为它们的数量不会少。我在想也许有一些最佳实践/方法可以做到这一点?

标签: c# fluent fluent-interface


【解决方案1】:

真正的关键是如果你需要一个特定的序列来让一个流畅的 API 工作你的 API 需要改进。也许你应该考虑一些不同的东西。如果 ChangeUserName 需要 OpenConfiguration,则 API 的使用者不应该关心。要么内化依赖,所以 API 变成:

CreateWorkflow -> 更改用户名

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

CreateWorkflow(IConfigurationManager) -> 更改用户名

CreateWorkflow -> ChangeUserName(IConfigurationManager)

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这是按特定顺序强制执行方法链的示例代码。我使用了来自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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 2010-10-23
      相关资源
      最近更新 更多