2012-01-25 17 views
0

今私は、モデルプロジェクト、サービスプロジェクト、ユーティリティプロジェクト、および1つ以上のドメインモデルのリポジトリとして機能するいくつかのDatastoresプロジェクトに沿ってASP MVC Webアプリケーションを用意しています。私は各層の分離にかなり満足していますが、私はサービス層からウェブアプリに戻るべきものについています。サービスからASP MVC Webアプリケーションに戻るのは何ですか?

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

しかし、電子メールがすでに存在する場合、サービス層はWebアプリケーションにどのように通知する必要がありますか?より複雑な状況では、複数のドメインオブジェクトとビジネスルールの存在/妥当性をチェックする必要があるかもしれないので、複数のエラーを一度に返さなければならないでしょう。さらに、例外をWebレイヤにバブルさせたくないので、サービスレイヤはすべての例外をトラップしますが、どのようにWebレイヤに通知する必要があります。

すべてを返す方法が見つかったとしても、Webレイヤーはすべての処理を負担し、ユーザーにさまざまなフィードバックを提供します。コントローラコードは大量になり、エラープルーンになります。プレゼンテーションのサービス結果に関するベストプラクティスはありますか?私は別のサービス層を排除し、コントローラ内にコードを持っているべきですか?どんな考えも歓迎されます。

答えて

0

私はあなたがこのようなコードを記述することができ、この目的のためにoperation modelライブラリ、書いた:

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プロジェクトのソースコードを確認してください。

+0

ありがとう。私はたぶんこのようなことをやろうとしますが、おそらく各サービスコールのためにカスタマイズされた結果を持っています。 –

0

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

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

  1. メッセージクラスの配列を作成し、メッセージクラス
  2. を作成し、 HttpContext.Items
  3. に保管してください
  4. は、ビュー/コントローラでそれを消費すること配列にいずれの層に新しいメッセージを追加

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

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

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

+0

サービスレイヤをHttpContext対応にしたいとは思っていませんが、以前は考えていなかった可能性があります。ありがとう! –

+0

HttpContext.Itemsは、要求の間存続する単なるコンテナです。私が記事で述べたように、あなたはどんなコンテナをも使うことができます。システムを配布する予定がない場合は、httpcontextを使用しないでください。コードのために – chandmk

関連する問題