Fluent API 中如何保证方法的顺序?

问题描述 投票:0回答:3

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

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

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

c# fluent fluent-interface
3个回答
7
投票

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

0
投票

真正的关键是,如果您需要特定的顺序才能让流畅的 API 工作,那么您的 API 需要改进。也许你应该考虑一些不同的事情。如果 ChangeUserName 需要 OpenConfiguration,则 API 的使用者不应该关心。要么将依赖关系内部化,使 API 变成:

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

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

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

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

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

希望这有帮助。


0
投票

1.在 DatabaseContext 中创建序列

2.在OnModelCreating中输入代码

builder
.HasSequence<int>("SequenceName", schema: "SequenceSchema")
.StartsAt(100)
.IncrementsBy(1)
.HasMax(int.MaxValue);

builder.Entity<TableName>()
.Property(a => a.PropertyName)
.HasDefaultValueSql("NEXT VALUE FOR SequenceSchema.SequenceName");
© www.soinside.com 2019 - 2024. All rights reserved.