尝试针对FluentValidation进行TDD并寻找表示美国国家列表的正确方法。
例如,我有一个“地址”对象。
我想写一个测试(和FluentValidation规则),如果它不在美国国家列表中,则声明该地址无效。
这是一个有限的列表,仅包含50个美国国家,所以我认为它应该是一个常数并且不在数据库中表示。
我想知道的是,存储和验证/测试的最有效方法是什么?枚举,数组,列表对象,什么?
答案 0 :(得分: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);
答案 1 :(得分: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
(例如全名,缩写,允许日期等)。
使用最简单的格式。
希望这有帮助。