【问题标题】:Questions on implementing Command Pattern in C# MVC在 C# MVC 中实现命令模式的问题
【发布时间】:2024-04-24 21:15:02
【问题描述】:

我希望这是直截了当的。我正在尝试在我正在制作的 MVC 应用程序中实现命令模式。我看到的唯一问题是 Command 对象的数量非常多。

我有 11 个表,每个表有大约 20 个需要更新的字段。

我的问题是我需要为每个字段设置不同的对象吗?

这是一个医疗保健应用程序,所以让我举个例子。 我有一个名为 KeyHospital 的表,该表存储医院信息,并且仅存储我们医院客户的医院信息。我使用 Linq to SQL 连接到数据库。就字段而言,KeyHospital 表可能是最大的。我所做的是为每个字段创建一个新对象。

public class ChangeHospitalDEA : ICommand
{
    public ChangeHospitalDEA(int id, string newDEA)
    {
        var Thishospital = (from Hospital in _context.Keyhospitals
                            where Hospital.ID == id
                            select Hospital).Single();

        Thishospital.DEAnum = newDEA;
    }
}

我将 ICommand 作为一个抽象类。

public abstract class ICommand
{
    public AllkeysDataContext _context = new AllkeysDataContext();

    public void Execute()
    {
        _context.SubmitChanges();
    }
}

我这样做对吗?我只是觉得我为此编写了很多代码,这是我第一次使用命令模式。

【问题讨论】:

    标签: c# model-view-controller command


    【解决方案1】:

    相当细化。相反,您应该为诸如插入新实体、(一个或多个相关对象的图形)更新实体等操作定义命令。

    只要你想执行一个动作,就会使用一个命令。在某些情况下,更改单个字段可能会构成一项操作,例如返回其他数据或提供建议。例如用于验证输入地址的 AJAX 调用。此外,ICommand 对于基本抽象类来说是一个糟糕的名称选择。 ICommand 是命令体系结构的通用接口。 (“I”前缀通常是为接口名称保留的。)我主要处理 MVVM,但我怀疑 MVC 已经有一个通用的命令接口。

    【讨论】:

    • 我相信 MVCContrib 内置了一些命令接口,github.com/jeffreypalermo/mvc2inaction/blob/master/manuscript/…
    • 我永远不需要插入任何东西,我只需要用新信息更新字段。我将其分解为能够更改每个字段,因为通常用户只需要更改一个字段。我相信我的应用程序中的每个字段都可能会自行更改。我确实将 ICommand 命名为其他名称,但随后注意到智能感知没有获取任何 ICommand,我将再次将其更改为其他名称以解决该问题。此外,它最初是一个接口,但我将其更改为抽象类。感谢您的帮助!
    • +1。我在 WinForms 应用程序中使用 MVC 模式并通过使用数据绑定来更新模型。模型类用作对象数据源。非常便利。更新单个字段不需要命令。
    【解决方案2】:

    这可能不是您想听到的,但我会将您的用户界面重组为基于任务的 UI,并将您的 UI 构建为常见任务,例如更改缉毒署编号,这些任务可以随着时间的推移而改进。

    如果您有现有的分析,您会注意到某些字段只会一起更改,并且这些字段可以在逻辑上分组为常见任务 我还觉得在构造函数中隐藏数据库调用是一种不好的做法,并将该 linq 语句移动到 Execute 方法,让 ctor 只初始化公共属性或私有字段,并让它们在执行方法中使用。

    将查询移至执行方法的主要原因是减少任何乐观并发错误的机会。

    另外我也觉得调用 Base 类 ICommand 不是一个好习惯,以后可能会造成混乱,建议你调用 CommandBase 或者再改成接口。

    【讨论】: