UI и Application связь - PullRequest
       36

UI и Application связь

0 голосов
/ 19 декабря 2009

Я прочитал много статей об интерфейсе пользователя, логике бизнеса, WCF, IoC, но все же одна вещь отсутствует в моей голове. Я создаю приложение winforms и консольное приложение. Консольное приложение - это мозг. Теперь во всей клиент-серверной архитектуре клиент «знает» сервер, отправляет ему запрос и получает ответ. Мой вопрос следующий:

1) Как консольное приложение может отображать сообщение для пользователя, если он не знает о существовании пользовательского интерфейса? Должен ли пользовательский интерфейс проверять и пул сообщений каждые x мс? это хороший подход?

2) что в случае, если в формах пользовательского интерфейса должна отображаться цена тикера, например, цена акций, которая постоянно меняется? Должен ли он запрашивать цену тикера из консольного приложения каждые 200 мс? или зарегистрировать функцию обратного вызова в консольном приложении, чтобы консольное приложение могло вызвать ее? Однако разве это не превращает пользовательский интерфейс в сервер сейчас?

3) Что произойдет, если я захочу добавить возможности терминала в свое приложение (например, telnet cli), как мне его спроектировать? сервер telnet как клиент и мое консольное приложение как сервер? Есть ли дизайн, который может помочь мне достичь этого? ТАКСИ? Я спросил много людей, и кажется, что никто не использует это ... это так?

Спасибо, Эяль

Ответы [ 3 ]

2 голосов
/ 19 декабря 2009

Ваша программа должна быть разработана таким образом, чтобы вы могли заменить один интерфейс другим. Программа должна иметь возможность иметь логическую функцию независимо от интерфейса, который видит пользователь. Посмотрите на шаблоны MVC и Observer .

Одной из хороших мер вашей программы являются интерфейсы, предоставляемые пользователю [вызовы API, графический интерфейс на основе консоли, интерфейс на основе консоли, сетевой интерфейс, веб]. Я не намекаю на то, что вам следует переориентировать намерение приложение, чтобы сделать его очень гибким с интерфейсом. Я предлагаю, чтобы ваш интерфейс не имел ничего общего с логикой и хранилищем данных вашего приложения.

Биржевой тикер: есть шаблон оберсервера, который передает новое событие каждые 200 мсек или при изменениях. Представление тикера будет подписчиком этих событий.

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

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

Вам нужно установить канал связи между процессами, чтобы заставить их работать вместе. Труба или розетка - это обычный выбор, ментальная модель здесь - это машины, разговаривающие друг с другом по сети. Это может быть очень неудобно, у вас есть все недостатки веб-приложения, ни одно из преимуществ клиента WinForms или приложения в консольном режиме. Это также очень ненадежно, сбой одного процесса трудно диагностировать, сообщить и восстановить другим приложением. Я уверен, что вы видели, что может пойти не так с использованием вашего интернет-браузера.

Вы можете получить то, что вы хотите из одного приложения. Класс System.Threading.Thread дает вам моральный эквивалент вашего приложения в режиме консоли. Получить интерфейс для отображения сообщений из мозгового потока довольно просто с помощью класса BackgroundWorker или метода Control.Begin / Invoke (). Только «честно» между прочим, добиться правильного взаимодействия потоков все еще сложно.

Существует два способа реализовать обновление биржевого тикера. Толчок против подхода притяжения. Метод принудительной отправки позволяет фоновому потоку активно уведомлять поток пользовательского интерфейса о наличии обновления. BackgroundWorker.ReportProgress или Control.Begin / Invoke для этого. При обновлении 200 мс это не проблема.

При таких показателях модель pull будет работать так же хорошо. Вы бы использовали Timer в пользовательском интерфейсе, чтобы периодически запускать метод. Он может прочитать значение из общего свойства в методе Tick таймера. Вам нужно будет использовать оператор блокировки как в фоновом потоке, так и в методе Tick, чтобы гарантировать, что значение не может измениться, так как поток пользовательского интерфейса читает значение.

Следует отдавать предпочтение модели извлечения, когда значение может изменяться очень быстро, нажимая со скоростью, которая поставит поток пользовательского интерфейса на колени, когда время, необходимое для обновления пользовательского интерфейса, больше, чем период между обновлениями из фонового потока. Поток пользовательского интерфейса будет отставать и не будет выполнять свои обычные обязанности. Замороженный интерфейс - это диагностика, а OOM - конечный результат. 200 мсек не должно быть проблемой, если вы не очень увлекаетесь обновлениями пользовательского интерфейса или неаккуратны, push должен работать.

Мне нужно присоединиться к лиге друзей, с которыми вы консультировались по поводу серверов telnet. Не зная, какую проблему они решают, они являются эквивалентом веб-сервера 1990 года, когда все использовали терминал с зеленым экраном для общения с компьютером. Возможно, это относится к необходимости подключения отдельного приложения в режиме консоли к приложению пользовательского интерфейса. Вы не будете использовать telnet для этого, сокет - это общий канал. .NET Remoting или, что еще лучше, WCF - это слой, который расположен поверх этого канала, чтобы избежать необходимости сталкиваться с трудностями сжатия данных или параметров метода через канал байтов. Продолжайте, если вы уже полностью включены в многопроцессное решение. Вы не должны подходить для биржевого приложения, никому нет дела до того, как они будут работать, если на них никто не смотрит. Падение дерева в лесу, возможно.

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

Почему бы вам не создать "мозг" как библиотеку? И интерфейс WinForms, и консольное приложение являются пользовательскими интерфейсами и должны быть отделены от логики. Это упрощает доступ к функциям, и вы также можете подписаться на события.

...