1

在工作中,我要维护的产品有很多“移动部件”,这是我对其架构方式的主要症结之一,如果十个不同的位置需要知道选择了列表中的新项目,直接代码路径必须编码。例如在以下布局中。

                          Form1
                            |
        +-------------------+---------------------+
        |                   |                     |
     Control1            Control2              Control3
        |                   |                     |
        |             +-----------+          +----+----+
        |             |           |          |         |
SelectionList       View1       View2      View3     View4

(我工作的实际应用程序对于 GUI 组件有比这更多的层...... bleh......)

如果我们向任何控件添加另一个视图,这取决于选择了哪个项目,Form1 需要路由消息。更糟糕的是,如果我们从选择列表或任何视图中添加可以在选定项目上调用的各种命令,则需要修改视图以正确调用操作。通常此类操作位于 Form1 中(也可通过主菜单选项获得......)

(将 SelectionList 想象成一个文件列表......)

这看起来既脆弱又麻烦。

最近我一直在玩弄在应用程序中制作(或在价格合适时获得)一个子系统的想法,事件(例如命令)的发布者和订阅者只需要知道事件参数的定义和事件的名称,以便接收事件。

我的问题是:

  1. .Net 3.5 中是否有商业、开源或公共领域的库已经这样做了?(我使用 C#。)这需要是一个 INTRA-APPLICATION 机制。我已经知道MSMQ 和This Codeplex 项目等跨应用程序库和机制。

  2. 如果您有开发或使用此类解决方案的经验,那么要避免的三大陷阱是什么?

4

2 回答 2

1

我会看一下 Prism ( http://www.codeplex.com/compositewpf ),它包括EventAggregator服务,它几乎完全符合您的要求。EventAggregator 完全不限于 WPF,而是复合 UI 的东西。

于 2009-12-05T23:50:12.410 回答
1

这可以作为一个轻量级的消息传递框架吗?

function MyConstructor() {
    this.MessageQueues = {};

    this.PostMessage = function (Subject) {
        var Queue = this.MessageQueues[Subject];
        if (Queue) return function() {
                                        var i = Queue.length - 1;
                                        do Queue[i]();
                                        while (i--);
                                    }
        }

    this.Listen = function (Subject, Listener) {
        var Queue = this.MessageQueues[Subject] || [];
        (this.MessageQueues[Subject] = Queue).push(Listener);
    }
}

那么你可以这样做:

var myInstance = new MyConstructor();
myInstance.Listen("some message", callback());
myInstance.Listen("some other message", anotherCallback());
myInstance.Listen("some message", yesAnotherCallback());

然后:

myInstance.PostMessage("some message");

将调度队列

于 2010-06-28T15:57:35.657 回答