4

尝试针对 FluentValidation 进行 TDD 并寻找代表美国州列表的正确方法。

例如,我有一个“地址”对象。

我想编写一个测试(和 FluentValidation 规则),如果地址不在美国州列表中,则声明该地址无效。

这是一个有限的列表,只包括美国的 50 个州,所以我认为它应该是恒定的,而不是在数据库中表示。

我想知道的是,存储和验证/测试这个最有效的方法是什么?一个枚举、一个数组、一个列表对象,什么?

4

2 回答 2

2

使用static readonly数组或 HashSet。

一个州可以用它的全名或缩写来表示。你要检查两者吗?此外,可以通过邮政编码验证状态(我不确定您是否要这样做)。

您可能有一个静态只读单数组或包含全名和缩写的哈希集,如下所示:

public static readonly string[] listOfStates = new string[]
    {
        "New York",
        "NY",
        // rest of states & abbreviations here...
    };

或者

public static readonly HashSet<string> listOfStates = new HashSet<string>
    {
        "New York",
        "NY",
        // rest of states & abbreviations here...
    };

两者都支持Contains语法:

// Queryable like this:
bool stateMatch = listOfStates.Contains(stringValue);
于 2010-09-11T04:27:45.837 回答
1

我会把它们保存在一个常量字符串数组中......

//Define the constant array
const String[] TheStates = new String[] { "Alabama", "Arizona", ... };

//fluentvalidation rule
RuleFor(address => address.State).Must(theState => TheStates.Contains(theState));

将它们保持在一个Enum状态将需要在状态名称和整数值之间建立某种关联——这听起来并不那么有效。或者您必须使用ToString()很多或为枚举中的每个项目构建一些自定义属性(我已经看到了一些这样的示例 - 但是您正在处理反射,这不是那么高效)。

List只有当您需要每个州的一些额外数据(例如全名、缩写、录取日期等)时,我才会考虑使用。

尽可能使用最简单的格式。

希望这可以帮助。

于 2010-09-11T02:51:56.517 回答