0

我正在编写一个小型演示应用程序(用于更大项目的概念证明),它将利用 C#(.NET 4.5)中的被动视图 MVP 架构。

无需过多详细介绍,它是一个允许您使用拖放工具在大画布上绘制特定过程(类似于 Visio)的应用程序,然后我们根据绘制和配置的内容运行模拟。

现在,人们在我们的遗留应用程序中所做的是为流程节点设置自定义图像,因此区分节点或使其看起来更像真实世界的情况非常容易。

像节点的位图这样的东西在 MVP 模式中会驻留在哪里?显然很想坚持使用模型,但这会破坏 MVP 模式(例如,如果我们只是有一个命令行界面呢?)。将它作为视图的一部分似乎与底层对象本身脱节了。

另外,作为第二个小问题,对于像我描述的那样的绘图风格应用程序,这些对象视图是否可能来自UserControlCustomControl?对于基本上只是一些位图来说,这似乎是一个相当大的开销。

下面是一个非常简单的节点的示例,它充当非常简单的模型。通常会发生的情况是,当它的状态发生变化时,它看起来会有所不同,即应用不同的位图。

public enum NodeStates{ Idle, Working, Broken, ResourceStarved, Blocked };

public class Node: ModelBase
{
    private string _username;
    private NodeStates _currentState;

    public Node(string username)
    {
        _username = username;
        _currentState = NodeStates.Idle;
    }

    public string Username
    {
        get
        {
            return _username;
        }

        set
        {
            if (_username != value)
            {
                _username = value;
                NotifyChanged();
            }
        }
    }

    public NodeStates CurrentState
    {
        get
        {
            return _currentState;
        }

        private set
        {
            if (_currentState != value)
            {
                _currentState = value;
                NotifyChanged();
            }
        }
    }

    public void DoWork()
    {
        CurrentState = NodeStates.Working;
        //Todo, schedule work complete time
    }

    public void WorkComplete()
    {
        CurrentState = NodeStates.Idle;
    }   
}
4

1 回答 1

0

您关于使用位图和控制台类型应用程序的观点是有效的。但是,我认为节点的位图是节点的一个属性,应该保留在那里。

表单/控制台输出通常由具体视图处理。对于 MVP 的被动视图风格,这不太适合,因为您可能会通过视图界面上的特定方法或属性分配位图。这意味着基于控制台的视图实现将有效地忽略这一点并且不对其进行任何处理,我认为这就是您感到不安的地方。

查看监督控制器的风格,问题并没有那么明显,因为您将节点交给视图,然后视图将决定渲染什么,而基于控制台的视图对位图不做任何事情。这实际上等同于相同的功能,但以更优雅的方式。

因此,我的回答是:将位图保留为 Node 的一个属性。如果您使用被动视图,则基于控制台的具体视图对位图没有任何作用。

于 2013-06-12T08:58:14.950 回答