流畅的编程 - 空方法

时间:2014-06-06 13:13:27

标签: c# fluent fluent-interface

我目前正在研究使用流畅的API进行构建的MVC控件。 我暂时没有麻烦。

但我的流畅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方法如何知道它是否应该验证给定的对象以查看它是否是一个字符串。 我想我需要将整个链传递给它并基于链执行我的逻辑?

有人能为我提供一些关于如何完成这样的事情的指导吗?

1 个答案:

答案 0 :(得分: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");