5

Web>サービス>コアの3つのレイヤーを持つWebアプリケーションがあります。サービスには、WebがviewModelsを構築および解釈するのに役立つ一連のビジネスロジックがあります。ただし、サービスレイヤーに問題がある場合があり、ユーザーはエラーページにプッシュされる必要があります。

MVCアプリケーションのサービスレイヤーでエラー処理をどのように実装する必要がありますか?例えば:

public void DeleteOrder(int orderId)
{
    var order = _db.Order.FirstOrDefault(c => c.OrderId == orderId);
    if (order == null)
    {
        // error handling
    }

    _db.Orders.Remove(order);
    _db.SaveChanges();
}

そのisNullブロックには何が入りますか?

4

3 に答える 3

6

通常、例外処理コードはコントローラーに配置します。あなたの用語では、MVCコントローラーが「Web」レイヤーに存在し、これらのコントローラーが「サービス」レイヤーのメソッド(表示した「DeleteOrder」メソッドなど)を呼び出すと想定しています。この場合、DeleteOrder のエラー処理コードで、単純に例外をスローする必要があります。

if (order == null)
{
    throw new InvalidOperationException("Specified OrderId does not exist");
}

このようにして、未処理の例外が、例外処理コードが存在するコントローラーに渡され、そこで例外をログに記録して、ユーザーを適切なエラー ページにリダイレクトできます。

コントローラーで例外を処理する方法に関しては、いくつかのオプションがあります。

  1. アクション メソッドごとに try-catch ブロックを使用する
  2. OnExceptionメソッドを実装して、コントローラー クラスにIExceptionFilter インターフェイスを実装します。
  3. 組み込みのHandleErrorAttribute 例外フィルターを使用する
  4. 独自のカスタム例外処理フィルターを作成する

4 番目の方法 (独自の例外フィルターを作成する) は、おそらく最も堅牢な方法です。ここでは、例外のログ記録と、スローされた例外の種類に基づいてユーザーを適切なエラー ページにリダイレクトするコードを追加できます。

MVC コントローラーの例外処理の概要については、こちらを参照してください。

于 2013-02-20T03:26:26.790 に答える
2

ユーザーフレンドリーな例外をスローする方法です。コントローラーは、サービス レイヤーを呼び出すコードを試行/キャッチし、ユーザーを適切なエラー ページにリダイレクトすることで、それに応じて動作する必要があります。

あなたが示す特定の例では、 OrderNotFoundException は問題ありません。

于 2013-02-20T03:29:28.587 に答える
0

サービス レイヤーが WCF 上に構築されている場合は、Fault Contractを使用してエラー/例外情報を伝達します。

于 2013-02-20T07:34:37.813 に答える