1

ASP.net MVC (必ずしも MVC に限定されるわけではなく、例にすぎません) では、以下のようなアクション メソッドに常に前提条件があります。

[HttpPost]
public ActionResult Edit(FooModel viewModel)
{
    if (viewModel == null)
    {
        throw new ArugmentNullException("viewModel");
    }

    if (viewModel.Foo < 1)
    {
        throw new InvalidOperationException();
    }

    // Perform real tasks on viewModel (e.g. map it to model, persist to database)

}

これで、チェックをリポジトリ クラスの静的メソッドにリファクタリングできることがわかりました。

[HttpPost]
public ActionResult Edit(FooModel viewModel)
{
    if (FooModelRepostory.IsValid(viewModel)
    {
    }

    // Perform real tasks
}

FooModelRepository.cs

public static bool IsValid(FooModel viewModel)
{
    if (viewModel == null)
    {
        throw new ArgumentNullException("viewModel");
    }

    if (viewModel.Foo < 1)
    {
        throw new InvalidOperationException();
    }

    // ...many more checks and throw exceptions accordingly

    // if we reach up to here, we are good, return true
    return true;
}

私の質問は、このようなチェックでリポジトリを乱雑にすることなく、コードをリファクタリングするためのより良い方法はありますか?

4

2 に答える 2

0

何かがすでにあなたによって提供されていることをより明確にするものは何もありません。Code Contracts、はい、宣言的な動作をプログラムに追加できますが、明確なロジックも隠します。したがって、何でもそうですが、それには良い面と悪い面の 2 つがあります。

私は個人的にあなたが選択したソリューションを使用するので、単純な制御方法を使用します. 私があなたの注意を喚起したい唯一のことは、次の事実です:

public static bool IsValid(FooModel viewModel)
{
 ...
}

returns 、したがって、失敗/否定的な応答の場合、例外が発生するのではなく、値が返されることboolを期待します。これはプログラムの制御フローなので、単純または十分であり、メソッドの消費者から期待されています。falsetruereturn truereturn false

于 2013-11-05T07:43:37.700 に答える
0

別のオプションは、検証クラスを作成することです。それらのクラスのオブジェクトをリストに追加し、各 Validation が有効かどうかをリストに尋ねるだけです。利点のほんの一部:

  • 同じ検証を他のコントローラーに再利用できます。
  • 検証が追加された場合、既存のコードはそのまま残されます (オープン クローズ/原則)
  • コントローラーを呼び出して動作するかどうかを確認する必要がないため、検証の単体テストが簡単になります。
  • 検証で「すべての参照を検索」すると、検証を使用するすべてのコントローラーが表示されます
  • 検証を変更せずに bool だけの例外が必要かどうかを後で選択できます。

詳細と例: ここにリンクの説明を入力してください

于 2014-01-17T15:12:00.363 に答える