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 に答える