【问题标题】:Fluent programming - empty methods流利的编程 - 空方法
【发布时间】:2014-07-27 18:40:02
【问题描述】:

我目前正在研究使用流式 API 进行构造的 MVC 控件。 目前我对此没有任何问题。

但我的 fluent API 中的每个方法都需要一个参数。根据该参数设置一个属性。

例如:

var grid = GridFor<Model>(items).WithName("MyName").WithRowHeader("true");

但现在我想知道,当您拥有不带参数的方法时,流畅的 API 是如何工作的。

例如:

var result = Model.Validate(x => x.Age).When().It().Is().Any().Number();

更详细地说,我正在努力采用这样的方法:

string s = "Hello";
s.Validate().It().Is().String();
s.Validate().It().Is().No().String();

我在 String 方法如何知道它是否应该验证给定对象以查看它是否为字符串方面遇到了困难。 我想我需要将整个链传递给它并基于链执行我的逻辑?

有人可以指导我如何完成类似的事情吗?

【问题讨论】:

  • 有什么区别?
  • 它们只是方法。它们的工作原理与任何其他方法一样。
  • 我真的不知道应该如何完成。这可能是微不足道的,但我只是没有看到。
  • 我知道这些是方法,但我不明白我应该如何将它们相互链接。
  • 如果括号是你的问题,你可以改用Properties

标签: c# fluent fluent-interface


【解决方案1】:

有点像这样:

public static class ValidationExtensions
{
    public static Validation<T> Validate<T>(this T source)
    {
        return new Validation<T>(source);
    }
}

public class Validation<T>
{
    private readonly T valueToValidate;

    public Validation(T value)
    {
        valueToValidate = value;
    }

    public void Is<T>(T value)
    {
        if (!Object.Equals(valueToValidate, value))
            throw new Exception();
    }

    public NegativeValidation<T> Not()
    {
        return NegativeValidation(value);
    }
}

public class NegativeValidation<T>
{
    private readonly T valueToValidate;

    public NegativeValidation(T value)
    {
        valueToValidate = value;
    }

    public void Is<T>(T value)
    {
        if (Object.Equals(valueToValidate, value))
            throw new Exception();
    }

    public NegativeValidation<T> Not()
    {
        return Validation(value);
    }
}

string s = "Hello World";
s.Validate().Is("Hello World");
s.Validate().Not().Is("Hello World"); // exception
s.Validate().Not().Not().Is("Hello World");

【讨论】:

  • 谢谢,已经有点清楚了,不过在想像中我想用的:s.Validate().Is().Any().String();然后我不知道应该如何实施。因为方法 Is() 和 Any() 不会自己做任何事情。但是最后一个方法(String())现在必须被“Is().Any()”调用,因为它也可能被“Is().Not().Any()”调用。代码差异很小,验证差异很大。你介意让代码适应我在这里提出的建议吗?这对我来说很清楚。
  • @Complexity 这些方法中的每一个都将返回一个不同的类或接口,并引用以前的类。
  • 但这确实意味着我需要将整个链条传递进去。因为 Is() 和 Not() 将返回相同的接口,最后在我的方法 Any() 中我必须知道我应该验证哪个。
  • 这不是“流利的”编程,而是将先前方法调用的“历史”存储在对象内部的某个位置,以构建表示验证模型的表达式。虽然可以做到,但它很复杂并且容易被破坏(如果你忘记“重置”限制),你可以用它做的所有事情都可以用正确构造的方法来做。
  • 我知道,但我正在查看做类似事情的起订量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多