Asp.net mvc 3 .NET MVC 3中的命令模式(从控制器中删除垃圾)

Asp.net mvc 3 .NET MVC 3中的命令模式(从控制器中删除垃圾),asp.net-mvc-3,single-responsibility-principle,command-pattern,Asp.net Mvc 3,Single Responsibility Principle,Command Pattern,我正试图在我的.NETMVC3应用程序上实现这一点,专门用于保存对某个对象的编辑。我还没有决定如何进行。在我进入实际问题之前,这里是简化的代码: public class ThingController { private readonly ICommandHandler<EditThingCommand> handler; public ThingController(ICommandHandler<EditThingCommand> handler)

我正试图在我的.NETMVC3应用程序上实现这一点,专门用于保存对某个对象的编辑。我还没有决定如何进行。在我进入实际问题之前,这里是简化的代码:

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...
    }
}
然而,在我的控制器中仍然会发生构建修改。这是本案的大部分工作。在构建ModifiedThing(以及应用于它的用于乐观并发检查的“旧”时间戳)时,剩下的就是命令在我的数据上下文上调用Update


显然,能够轻松地用其他命令装饰它是有价值的,但是我也希望能够将修改内容的构造移动到我的控制器之外。(也许这个问题真的就是这个。)EditThingCommand在我的域中,没有对EditThingViewModel的引用,所以它不能放到那里在演示层中使用另一个命令将viewmodel映射到poco实体有意义吗?

我在域外创建了一个EditThingPostCommand,它将EditThingViewModel作为参数。EditThingPostCommandHandler负责创建EditThingCommand并调用其处理程序


这是可行的,但我不认为这是我问题的最佳答案。EditThingPostCommandHandler正在做的大部分工作可以在自定义AutoMapper配置中完成,这仍然可以用于清理控制器操作方法

在其他项目上使用此模式几个月后,我发现此特定项目上的命令过于通用,因此过于复杂,需要太多的设置。例如,最好创建一个EditThingTitleCommand和一个MoveThingPiecesCommand等等,并从它们自己的ActionMethods调用它们


换句话说,当使用命令模式时,不要仅仅使用命令来替代典型的CRUD操作。更具体的特性带来更多的好处。

我建议查看Paul Stovell的文章“清理ASP.NET MVC控制器”
public class EditThingCommand
{
    Thing ModifiedThing;
}