3

私はおそらくここで分析しすぎていますが、MVCで行ったすべての読み物を見ると、物事のやり方について非常に多くの意見があるようです。

MVCの各部分の責任を定義する「ベストプラクティス」サイトまたはドキュメントはありますか?

私が持っているいくつかの質問は、私がEF / Repository&UnitOfWork /Serviceパターンを使用していることを覚えておいてください:

1)ドメインオブジェクトとビジネスルールの検証結果(エラーメッセージなど)をサービスレイヤーからビューモデルに取得するにはどうすればよいですか?

2)ドメインオブジェクトとすべてのビジネスロジックを実行するサービスレイヤーを使用している場合、ドメインオブジェクトをコントローラーに送信し、(AutoMapperを介して)ビューのビューモデルに変換します。コントローラーの責任は他にどのようなものですか?次のコードは大丈夫ですか?これはコントローラーのロジックが多すぎますか?:

public ActionResult SomeAction()
{
    var model = Mapper.Map<DomainObject, ViewModel>(service.QueryReposForData());
    model.SomeCollectionForSelectList = Mapper.Map<IEnumerable<DomainObject>, IEnumerable<ViewModel>>(service.QueryReposForSelectListData());
    return View(model);
}

コントローラ内の唯一のものは、ビューモデルにマップされたオブジェクトグラフを含むビューを返す1本の線ではないと思いますか?

3)ViewModelsにプロパティを設定して、たとえば何かを非表示にできるかどうかをビューに示してから、ビューでそのロジックを実行しても問題ないと思いますか?例:

@if(Model.DisplaySomething)
{
    <div>Something to show</div>
}
else
{
    <div>Something else to show</div>
}

TransactionResult4)トランザクションを処理するのはサービスの責任になるように、サービスが書き込み時にある種のオブジェクトをコントローラーに返すようにすることを考えていました。したがって、トランザクション(UnitOfWork)を開始して必要な処理を実行し、TransactionResultエラーメッセージが表示される可能性のあるこれを返す集約サービスがありますか?コントローラーにトランザクションの管理を任せる必要はないと思いますが、ドメインオブジェクトにマップされたビューモデルをサービスに渡して、それに基づいて動作させるだけですか?

5)また、どのくらいのActionFilterを使用しますか?これが大きな拡張ポイントであることは知っていますが、モデル作成のすべてをフィルターに詰め込もうとしていることに気付くことがよくあります。

4

3 に答える 3

3

私たちの働き方に基づいた意見です。

ほとんどの場合、コントローラーは拒食症になるほど痩せています。

ViewModelsについては、すべてのビューにViewModelがあるというパターンに従います。コントローラは、必要なものをすべてロードし、開始します。そこから、ViewModelがすべてを駆動します。私たちの世界では、ViewModelはビューに直接関連付けられており、アプリケーションの他の部分で使用される/使用される可能性のあるコードは含まれていません。それは、それが必要とするより大きな「モデル」(サービスレイヤーなど)の任意の部分と相互作用し、ビューが消費するために詰め物をパッケージ化します。

あなたの#3の例では、絶対にそうだと思います。これが、ViewModelの使用方法です。

繰り返しになりますが、これはいずれも福音ではありません。私たちがそれをどのように扱うかについての私の見解です。

于 2012-08-28T18:27:55.090 に答える
3

素晴らしい質問です!

1)ドメインオブジェクトとビジネスルールの検証結果(エラーメッセージなど)をサービスレイヤーからビューモデルに取得するにはどうすればよいですか?

バックエンドでEntityFrameworkを使用し、モデルとエンティティの両方にIValidatableObjectを実装しています。モデルでは、クロスフィールド検証を実行しますが、エンティティでは、クロスエンティティ検証を実行します。

2)ドメインオブジェクトとすべてのビジネスロジックを実行するサービスレイヤーを使用している場合、ドメインオブジェクトをコントローラーに送信し、(AutoMapperを介して)ビューのビューモデルに変換します。コントローラーの責任は他にどのようなものですか?次のコードは大丈夫ですか?これはコントローラーのロジックが多すぎますか?:

このコードは完璧です。コントローラーはデータを収集し、データをモデルに変換してビューにフィードします。

3)ViewModelsにプロパティを設定して、たとえば何かを非表示にできるかどうかをビューに示してから、ビューでそのロジックを実行しても問題ないと思いますか?例:

はい、これはまさにViewModelの目的です。ビューのレンダリングに必要なすべてのデータとロジックをキャプチャします。

4)トランザクションを処理するのはサービスの責任になるように、サービスが書き込み時にある種のTransactionResultオブジェクトをコントローラーに返すようにすることを考えていました。したがって、トランザクション(UnitOfWork)を開始して必要な処理を実行し、エラーメッセージが含まれる可能性のあるこのTransactionResultを返す集約サービスがありますか?コントローラーにトランザクションの管理を任せる必要はないと思いますが、ドメインオブジェクトにマップされたビューモデルをサービスに渡して、それに基づいて動作させるだけですか?

私は自分のプロジェクトでこれに少し苦労しました。最後に、EntityFrameworkのSaveChangesメソッドをフロントエンドに移動しました。これにより、フロントエンドでトランザクションを構築し、それを1回コミットすることができます。更新、作成、または削除を実行するApiControllerのすべてのメソッドは、SaveChangesも実行します。

私は、バックエンドと実際のControllerクラスの間の抽象化レイヤーとしてApiControllersを使用しています。詳述すると、私のアプリケーションは通常のコントローラー(HTML)とApiControllers(REST、別名Web API)の両方を使用します。どちらのタイプのコントローラーも、データを取得するための共通のインターフェースを共有しています。

例: http: //pastebin.com/uL1NGGqH

UnitOfWorkは、ファサードの背後にある私のバックエンドにまだ存在しています。SaveChangesをフロントエンドに公開するだけです。ValidationExceptionsなどの副作用は、ASP.NET MVCによって自動的に処理されるか、カスタムActionFiltersにキャプチャされます。

5)また、どのくらいのActionFilterを使用しますか?これが大きな拡張ポイントであることは知っていますが、モデル作成のすべてをフィルターに詰め込もうとしていることに気付くことがよくあります。

現在取り組んでいる大規模なMVCプロジェクトでは、ほんの一握りのActionFilterを使用しました。これらのActionFilterは主に、セキュリティを強化し、例外(ValidationExceptionsなど)をJSON形式に変換して、クライアント側の検証フレームワークが処理できるようにするために使用されます。

オフトピック:過度に分析することはできません。MVCのこれらの基本的な質問を自問することで、MVCの概念をよりよく理解し、一般的に優れた開発者になります。上司の時間にあまりやりすぎないように注意してください;)

于 2012-08-28T18:33:06.107 に答える
1

こっちも一緒:

  • 一般的なアクションフィルターを備えたベースコントローラー
  • 検証は、コントローラー内でDataAnnotationとモデル検証を使用して行われます。
  • ラップされたコンテキストまたは特定のサービスレイヤーが挿入された小さなコントローラー
  • AutomapperマッピングViewModels/EFPocos。

EF4は、 SaveChangeshttp://msdn.microsoft.com/en-us/ )内で行われたすべての変更に対して新しいトランザクションを自動的に作成するため(存在しない場合)、UnitOfWorkの実装やトランザクションの明示的な使用についてはあまり気にしません。 library/bb896325.aspx。コンテキストのDbSetをIQuerableおよびAdd/Delete/Findメソッドとして公開する汎用インターフェイスがあります。

しかし、言ったように、それはすべて個人的なものです。

于 2012-08-28T18:48:48.513 に答える