5

特に編集内容を Thing に保存するために、.NET MVC 3 アプリケーションにこのコマンド パターンを実装しようとしています。どのように進めていくか決めかねています。実際の質問に入る前に、簡略化したコードを次に示します。

public class ThingController
{
    private readonly ICommandHandler<EditThingCommand> handler;

    public ThingController(ICommandHandler<EditThingCommand> handler)
    {
        this.handler = handler;
    }

    public ActionMethod EditThing(int id)
    {
        ...build EditThingViewModel and return with View...
    }

    [HttpPost]
    public ActionMethod EditThing(int id, EditThingViewModel vm)
    {
        var command = new EditThingCommand
        {
            ...not sure yet...
        };

        this.handler.Handle(command);

        ...redirect somewhere...
    }
}

私の EditThingViewModel は、POCO クラスで構成されるドメインから完全に切り離されています。私の EditThingCommand は次のようになります。

public class EditThingCommand
{
    Thing ModifiedThing;
}

ただし、ModifiedThing のビルドは引き続きコントローラーで行われます。それがこの場合の作業の大部分です。ModifiedThing がビルドされるまで (およびオプティミスティック コンカレンシー チェックのために "古い" タイムスタンプが適用されるまで) は、データ コンテキストで Update を呼び出すコマンドだけが残っています。

明らかに、他のコマンドで簡単に装飾できることには価値がありますが、 ModifiedThing の構築をコントローラーの外に移動できるようにしたいと考えています。(おそらく、この質問はまさにそれに関するものです。) EditThingCommand は私のドメインにあり、EditThingViewModel への参照がないため、そこに移動できません。ビューモデルを poco エンティティにマッピングするために、プレゼンテーション層に別のコマンドを用意することは理にかなっていますか?

4

2 に答える 2

0

他のプロジェクトでこのパターンを数か月使用した後、この特定のプロジェクトのコマンドは単純に一般的すぎて複雑すぎて、設定が多すぎることがわかりました。たとえば、EditThingTitleCommand や MoveThingPiecesCommand などを作成し、それぞれの ActionMethod から呼び出すとよいでしょう。

つまり、コマンド パターンを使用する場合は、通常の CRUD 操作の代わりとしてコマンドを使用しないでください。より具体的にすると、より多くのメリットが得られます。

于 2013-05-24T20:36:21.303 に答える
0

EditThingViewModel をパラメーターとして受け取る EditThingPostCommand をドメイン外に作成しました。EditThingPostCommandHandler は、EditThingCommand の作成とそのハンドラーの呼び出しを担当します。

それは機能しますが、それが私の質問に対する最良の答えであるとは思いません。おそらく、EditThingPostCommandHandler が行っていることのほとんどは、カスタムの AutoMapper 構成で行うことができます。これは、コントローラーのアクション メソッドをクリーンアップするという目的に役立ちます。

于 2012-08-31T15:38:55.140 に答える