Начинающий WCF Настройка / Реализация Проектного Подхода - PullRequest
0 голосов
/ 16 марта 2011

См. Рисунок ниже для решения в VS2008, которое реализует WCF между Cient и Host.Клиент - это простое приложение Windows Form, а хост - консольное приложение.Я намерен использовать службу Windows в качестве хоста, но сейчас я использую консольное приложение для простоты и отладки.

Связь между ними - DCCService (часть WCF) с использованием netNamedPipeBinding;Клиент и Хост все будут находиться на одном компьютере.Кроме того, я знаю, что хорошей практикой является отделение службы WCF от хоста, чтобы ее можно было легко заменить, что хорошо в моем случае.

WCF Setup in VS2008

Вот моя загадка: Где должна выполняться работа, которую будут вызывать клиенты?

Работа, которую я хочу, чтобы моя служба выполняла, это опросить аппаратный контроллер наустановите интервал постоянно в фоновом режиме.Хотя DCCService предоставляет методы любым клиентам, которые хотят знать об этих данных.

Если код контроллера оборудования (setup (), connect (), work () и т. Д.) Выполняется в проекте DCCService или в Host Project?Если это делается в Host Project, как класс DCCService получает данные из класса Controller в проекте Host?Аналогично, как бы это было сделано, если бы класс Controller был в проекте DCCService?Что лучше?

Я думаю, что я упускаю что-то довольно простое здесь.Я ценю помощь или совет.Пожалуйста, дайте мне знать, если мне нужно быть более ясным.

Райан Р.

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Код, который опрашивает устройство, логически является частью вашей службы WCF, а не хост-проекта.Независимо от того, находится ли код физически в проекте службы WCF или в библиотеке классов, на которую ссылается проект службы WCF, это личное предпочтение.

Вот как я это сделал.

У меня есть WCF CollectionService, которыйразмещен в службе Windows.Проект CollectionService, очевидно, имеет класс CollectionService, который реализует интерфейс ICollectionService с включенным WCF, то есть как клиенты взаимодействуют с CollectionService.

В этом же проекте у меня есть класс Collector, который имеетзакрытый конструктор, предотвращающий создание экземпляров класса вне области действия класса.Класс имеет собственный статический список Collectors, который он поддерживает.Класс также имеет две статические функции - Start() и Stop().

Когда клиент хочет запустить Collector, он вызывает операцию Start() службы CollectionService.Этот CollectionService, в свою очередь, вызывает статическую функцию Collector.Start(), которая создает экземпляр Collector и сохраняет его в статическом списке Collectors.Когда клиент желает остановить Collector, он вызывает операцию Stop() службы CollectionService, которая преобразуется в вызов статической функции Collector.Stop(), останавливает Collector и удаляет его из списка.

Когда создается экземпляр Collector, он запускает новый поток, который начинает сбор данных и делает их доступными для заинтересованных сторон. Новый поток - это ключ. В противном случае экземпляр Collector просто будет сидеть в списке Collectors и ничего не делать.

Поскольку я имею дело с потоками, очевидно,Мне приходится иметь дело с вопросами синхронизации, такими как синхронизация доступа к статическому списку Collectors.Я не хочу, чтобы клиент пытался запустить Collector, в то время как кто-то другой пытается его выключить.

Вот и все в двух словах.

Если вы не создали службу WindowsТем не менее, вот две SO-поста, которые я написал и которые содержат пошаговые инструкции о том, как это сделать.

Первая ссылка в основном возвращает вас к службе;второй показывает, как установить / удалить его, не требуя InstallUtil.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ

Если только один Controller может быть запущен, тогда последующие вызовы для запуска Controller могут быть просто проигнорированы, возможно, с ответным сообщением, указывающим, что он уже запущен.

Если вы хотите, чтобы несколько клиентов получили доступ к данным из Controllerэто довольно просто.Вам просто нужно вести список подписчиков.Controller просто отправляет данные любым подписчикам в списке.

Такая структура публикации-подписки в WCF уже существует.Вы можете прочитать подробности здесь:

Что нужно знать об односторонних вызовах, обратных вызовах и событиях

Вы можете бесплатно загрузить этот фреймворк от Juval Lowy'sвеб-сайт, IDesign.net .Я использую эту концепцию, чтобы сигнализировать о событиях CollectionService заинтересованным сторонам.Я ожидаю, что вы можете использовать одну и ту же концепцию для предоставления данных нескольким клиентам.

0 голосов
/ 16 марта 2011

Похоже, вам нужна служба Windows для размещения (1) кода, опрашивающего аппаратный контроллер, и (2) хоста службы WCF.В этом случае лучше всего хранить служебный код службы (т. Е. Класс, наследующий ServiceBase и хост службы WCF) в exe службы, а фактическую функциональность - в библиотеке классов, на которую можно ссылаться из exe службы.

Я бы сделал так, чтобы иметь фоновый компонент, который опрашивает аппаратный контроллер и поддерживает «текущее состояние», которое будет храниться либо в памяти (возможно, в виде одиночного файла), либо в базе данных.Затем напишите службу WCF для запроса текущего состояния при поступлении вызовов.

HTH.

...