6

コマンドクエリ分離のアイデアは気に入っていますが、エンティティを追加しているMVCコントローラーアクション内でそれを使用する方法がわかりません。追加後に新しいエンティティのIDが必要になります。

たとえば、以下の簡略化された例では、サービスを使用して新しいアイテムを作成します。

public ActionResult Assign(AssignViewModel viewModel)
{
     var newItem = _AssignItemService.AssignItem(viewModel.ItemName, viewModel.ItemValue);

     return RedirectToAction("ListItem", new {id = newItem.Id);
}

ただし、新しいアイテムを表示するアクションにリダイレクトするときは、データベースから取得できるように、新しく作成されたアイテムのIDを知る必要があります。そのため、新しく作成されたアイテム(または少なくともそのID)を返すようにサービスに依頼する必要があります。

純粋なCQSでは、コマンドには戻り値がないため、上記のパターンは無効になります。

どんなアドバイスもありがたく受けました。

4

3 に答える 3

8

私はあなたが衒学的な点で立ち往生していると思います。

クエリは、データベースに「6月にミシシッピの西にある赤い色のアイテムを購入した顧客は何人ですか?」などの質問をしたい場合です。 それはクエリです。挿入中にIDを返すこと自体は、一般的なクエリではありません。

ソフトウェア開発の他のほとんどのものと同様に、このパターンは絶対的なものではありません。 ファウラーでさえ、都合の良いときにそれを壊しても構わないと言っています。

スタックをポップすることは、状態を変更する修飾子の良い例です。Meyerは、この方法は避けられると正しく言っていますが、これは便利なイディオムです。ですから、私はできる限りこの原則に従うことを好みますが、私はそれを破ってポップを得る準備ができています。

挿入とは別に、データベースから最後に追加されたIDを本当に取得したい場合は、ScopeIdentityのようなものを使用できます。しかし、私はあなたが追加の利益のために複雑さを追加していると思います。

于 2012-05-03T14:53:52.570 に答える
4

ビューモデルの値から作成された「Item」(またはエンティティの名前)のインスタンスをメソッドに渡す必要があります。そうすればAssignItem、メソッドは何も返す必要がなく、代わりにエンティティのIdプロパティを更新してCommandメソッドにします。

その後、entity.Idを任意の目的に使用できます

于 2012-05-03T15:02:44.053 に答える
0

これを行う方法は、呼び出し元に新しいエンティティのIDを指定させることです(これは、ほとんどの場合、GUIDをキーとして使用することを意味します)。

ただし、私の経験では、コマンドが結果を返さない可能性があるという(純粋な)ルールを課すことは、ほとんど利益をもたらさずに問題を引き起こすことになります。

于 2012-05-03T15:07:20.147 に答える