0

現在、モデル プロジェクト、サービス プロジェクト、ユーティリティ プロジェクト、および 1 つ以上のドメイン モデルのリポジトリとして機能するいくつかのデータストア プロジェクトに沿った ASP MVC Web アプリケーションがあります。各レイヤーの分離にはかなり満足していますが、サービス レイヤーから Web アプリに何を返すべきかについて悩んでいます。

たとえば、ユーザーが登録しようとすると、RegisterViewModel がコントローラーによって受信されます。個々の部分 (電子メール、パスワードなど) はサービス レイヤーに送信され、GUID、ステータス、作成日などを使用してメンバー ドメイン オブジェクトが構築され、それがストレージ用のリポジトリに送信され、最後に Web アプリがリダイレクトされるようにメンバー オブジェクトが返されます。 /Member/{guid}.

しかし、メールが既に存在する場合、サービス レイヤーは Web アプリにどのように通知する必要があるのでしょうか? より複雑な状況では、複数のドメイン オブジェクトとビジネス ルールの存在/有効性を確認する必要がある場合があるため、一度に複数のエラーを返す必要があります。さらに、例外を Web レイヤーにバブルさせたくないので、サービス レイヤーはすべての例外をトラップしますが、何らかの方法で Web レイヤーに通知する必要があります。

それらすべてを返す方法を見つけたとしても、Web レイヤーはそれらすべてを処理し、ユーザーにさまざまなフィードバックを提供するという負担がかかります。コントローラーのコードはかさばり、エラーが取り除かれます。プレゼンテーションへのサービス結果に関するベスト プラクティスはありますか? 別のサービス レイヤーを削除し、コードをコントローラー内に配置する必要がありますか? どんな考えでも大歓迎です。

4

2 に答える 2

0

まず、配布目的でサービスレイヤーを作成するかどうかを決定する必要があります。

サービスレイヤーを別のプロセス/マシンに配布する予定がない場合は、

  1. メッセージクラスを作成する
  2. メッセージクラスの配列を作成し、HttpContext.Itemsに保存します
  3. 次に、その配列の任意のレイヤーに新しいメッセージを追加します
  4. ビュー/コントローラーでそれを消費します

HttpContext.Itemsはリクエストの存続期間中利用可能であり、ビューまでずっと使用できます。

DIフレームワークを使用する場合は、ライフタイムオブジェクトごとのリクエストを使用して同じことを実現できます。

オブジェクトを配布したい場合は、サービスレイヤーから例外をスローすることに何の問題もありません。

于 2012-01-25T02:40:25.313 に答える
0

この目的のために、次のようなコードを記述できる操作モデルライブラリを作成しました。

public OperationResult Register(RegisterInput input) {

   var errors = new ErrorBuilder();

   if (errors.NotValid(input) // Invoke DataAnnotations validation
      || errors.Not(this.repo.FindUserByEmail(input.Email) == null, "Email '{0}' already exists.", () => input.Email))
      return errors;

   // Do stuff

   return HttpStatusCode.OK;
}

...そしてコントローラでは、エラー メッセージが ModelState にコピーされます。

[HttpPost]
public ActionResult Register(RegisterInput input) {

   var result = this.service.Register(input);

   if (result.IsError)
      return View().WithErrors(result);

   // Do stuff
}

このパターンを使用して作成されたMvcAccountプロジェクトのソース コードを確認してください。

于 2012-01-25T07:02:55.267 に答える