Существуют ли легковесные библиотеки публикации / подписки для общения внутри приложения? - PullRequest
1 голос
/ 06 декабря 2009

На работе у продукта, который я получаю, есть много «движущихся частей», одна из главных претензий, с которыми я сталкиваюсь, заключается в том, как его архитектура состоит в том, что в десяти разных местах нужно знать, что выбран новый элемент в списке, прямой путь кода должен быть закодирован. Например, в следующем макете.

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

(Реальное приложение, над которым я работаю, имеет больше слоев, чем это для компонентов графического интерфейса ... bleh ...)

Если мы добавим другое представление к любому элементу управления, который зависит от того, какой элемент выбран, Form1 необходимо направить сообщение. Хуже того, если мы добавим различные команды, которые могут быть вызваны для выбранного элемента, из списка выбора или любого из представлений, представления должны быть изменены, чтобы должным образом вызывать действие. Обычно такие действия размещаются в Form1 (и доступны также через опцию главного меню ...)

(Думайте о SelectionList как о списке файлов ...)

Это кажется хрупким и громоздким.

В последнее время я размышлял над идеей создания (или приобретения, если цена правильная) подсистемы в приложении, которую издатели событий (например, команды) и подписчики должны знать только об определении события Аргументы и название события для получения события.

Мои вопросы:

  1. Существует ли коммерческая библиотека с открытым исходным кодом или общедоступная библиотека, которая уже делает это в .Net 3.5? (Я использую C #.) Это должен быть механизм INTRA-APPLICATION. Я уже знаю о интерактивных библиотеках и механизмах, таких как MSMQ и Этот проект Codeplex.

  2. Если у вас есть опыт разработки или использования подобных решений, каких трех основных подводных камней следует избегать?

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Может ли это служить облегченной структурой передачи сообщений?

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");

будет отправлять очереди

1 голос
/ 06 декабря 2009

Я хотел бы взглянуть на Prism (http://www.codeplex.com/compositewpf), который включает в себя сервис EventAggregator , который в значительной степени выполняет то, что вам нужно. EventAggregator вовсе не ограничен WPF, а составным пользовательским интерфейсом вещи есть.

...