6

私の mvc3 プロジェクトには次のレイヤーがあります。

コントローラ -> サービス -> リポジトリ。

ViewModel を Entity にマップする必要がありますが、どのレイヤーにコードを配置するのが適切かわかりません。

コントローラーまたはサービスのいずれかを知っています。どちらを使用する必要があるか、およびその理由を教えてください。

ありがとうございました。

4

1 に答える 1

10

ViewModel を Entity にマップする必要がありますが、どのレイヤーにコードを配置するのが適切かわかりません。

もちろんコントローラー。サービス レイヤーとリポジトリ レイヤーは、ビュー モデルの意味を認識していません。ドメイン モデルのみを操作します。

そのため、コントローラー内で.Map<TSource, TDest>呼び出しを使用して、ドメイン モデルとビュー モデルの間でマッピングを行ったり来たりします。ただし、マッピング定義自体 (.CreateMap<TSource, TDest>呼び出し) は、AppDomain の有効期間ごとに 1 回、理想的にはProfile.

それでは、RESTful な用語でコントローラー アクション内の典型的なワークフローをいくつか考えてみましょう。

GET(RDBMS用語でSELECT):

  1. コントローラーは、サービス レイヤーにクエリを実行して、ドメイン モデル (ほとんどの場合、集約ルート) を取得します。
  2. コントローラーはマッピングレイヤーを呼び出して、ドメインモデルをビューモデルにマップします
  3. コントローラーはビューモデルをビューに渡します

PUT(RDBMS用語で挿入):

  1. コントローラーは、アクション引数としてビューからビューモデルを受け取ります
  2. コントローラーは、ビュー モデルをドメイン モデルにマップします
  3. コントローラーは、処理のためにドメイン モデルをサービス レイヤーに渡します。
  4. コントローラーは GET アクションにリダイレクトします

DELETE(RDBMS用語でDELETE)

  1. コントローラーはアクションパラメーターとして id を受け取ります
  2. コントローラーは、処理のために ID をサービス層に渡します (削除)
  3. コントローラーは GET アクションにリダイレクトします

POST(RDBMS用語で更新):

  1. コントローラーは、アクション引数としてビューからビューモデルを受け取ります
  2. コントローラーは、ビュー モデルに含まれる一意の ID を使用して更新するドメイン モデルを取得するために、サービス レイヤーにクエリを実行します。
  3. コントローラーは、ビュー モデルにも存在する、取得されたドメイン モデルのプロパティのみを更新します。たとえば、ドメイン モデルは Username プロパティと IsAdmin プロパティで構成され、ビュー モデルは明らかに Username プロパティのみで構成されます。そのため、ドメイン モデルの IsAdmin プロパティはそのままにして、Username プロパティを更新します。AutoMapper の用語では、これは.Map<TSource, TDest>メソッドの次の void オーバーロードに変換されます。Mapper.Map<ADomain, ViewModel>(domainInstanceControllerRetrievedUsingTheId, viewModelInstancePassedAsArgument);
  4. コントローラーは、更新されたドメイン モデルをサービス レイヤーに渡して処理 (更新) します。
  5. コントローラーは GET アクションにリダイレクトします

これら 4 つのワークフローがあれば、CRUD の世界に進む準備が整います。

PS REST リマインダー:

Create = PUT
Retrieve = GET
Update = POST
Delete = DELETE
于 2012-07-16T21:29:41.573 に答える