排他エラーをハンドルする共通処理拡張メソッドを作ってみた

ASP.NET Webフォームアプリケーションを作成する際、楽観的排他制御を行うのが一般的です。

このとき、排他エラーを検知した際の処理を集約例外ハンドラーに任せてしまえば楽ですが、実際は「業務エラー」扱いとして再実行させたいケースもままあると思います。

 

そんな時に使える拡張メソッドを作ってみました。

 

public static class PageExtentions
{
  public static void HandleDbUpdateConcurrency(this Page page, Action action)
  {
    try
    {
      action();
    }
    catch (DbUpdateConcurrencyException)
    {
      var validator = new CustomValidator()
      {
        ErrorMessage = "",
        IsValid = false,
      };
      page.Validators.Add(validator);
    }
  }
}

 

この例ではEFの排他チェック例外をキャッチし、排他チェックエラーが発生した旨をCustomValidatorを追加することで、ValidationSummaryに表示します。

もちろん、プロジェクト共通の既定Webフォーム等を用意して、エラー領域に表示してもいいでしょう。

(主題とは外れますが、排他チェック例外って使用するデータアクセステクノロジーごとに違う例外になっちゃうから、ビジネスロジック層あたりで独自例外にWrapしてやるのが良さそうですね。)

 

使い方はこんな感じです。

 

protected void UpdateButton_Click(object sender, EventArgs e)
{
  Page.HandleDbUpdateConcurrency(() =>
  {
    var item = Session["OriginalItem"] as MyItem;
    item.Name = NameTextBox.Text;

    var logic = new MyItemLogic();
    logic.Update(item);
  });
}

 

引数なしのラムダ式で排他チェック例外が発生する処理を記載してやります。

 

色々な画面ですべてのコマンドボタンのイベントハンドラーにtry-catchを書くなんてのはナンセンスなので、こういった方法で共通化してみてはどうでしょうか。

また、自分はこうやってるとかあればぜひ教えてください。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中