5

我正在尝试在我的 .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

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

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

于 2012-08-31T15:38:55.140 回答
0

在其他项目上使用这种模式几个月后,对我来说很明显这个特定项目上的命令太笼统了,因此太复杂了,需要太多的设置。例如,最好创建一个 EditThingTitleCommand 和一个 MoveThingPiecesCommand 等,并从它们自己的 ActionMethods 中调用它们。

换句话说,在使用命令模式时,不要只使用命令作为典型 CRUD 操作的替代品。更多的特异性带来更多的好处。

于 2013-05-24T20:36:21.303 回答