Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Совет по реализации взаимодествия


Автор: LittleCat 2.8.2012, 12:59
Доброго дня. Подскажите плииз, может кто сталкивался с такой задачей. Пишу проект на Шарпе. В проекте представлены несколько сервисов системных рабочих и сервис, который является как бы фасадом для остальных, обеспечивая взаимодействие с клиентом Сильверлайта или любым другим. Рабочий сервис является клиентом OPC к указанному ему серверу OPC и одновременно архивирует данные в базу. Реализован как отдельный класс КлиентОПС( например). Рабочих сервисов несколько. Пока 3.  Необходимо для взаимодействия с фасадным сервисом прикрутит к рабочему сервису реализацию WCF c контрактом pipeDuplex. Сделал библиотеку WCF - работает. Но как связать два объекта класса обьектКлиентОПС и обьектWCFбиблиотека в классе рабочего сервиса не могу придумать. Подписал WCF как IObserver к обьектКлиентОПС но это связь односторонняя. ОбьектWCFбиблиотека получает данные извне, которые обрабатываются в обьектКлиентОПС и тот должен начать генерировать данные для callback вызова в объекте обьектWCFбиблиотека на основе полученных данных. Писать один класс на все - повешусь.
Как обеспечить взаимодействие объектов разных классов, которые не должны знать о существовании друг-друга?
Прошу прощения за возможно, детский вопрос, но я недавно начал работать Шарп.

Автор: LittleCat 5.8.2012, 22:49
Может никто не делал а может я сумбурно описал ситуацию. Уточню тогда - как и куда копать, чтобы реализовать взаимодействие с сервисом WCF, реализованном в виде библиотеки в службе винды? Как передать ему параметры и как получить от него каике либо параметры не прибегая к реализации клиент-сервера. Я, например, хочу вернуть в лог сервиса ошибки WCF сервиса и передать ему какие либо параметры для возврата клиенту, который в данный момент подключен к WCF. 
  

Автор: mrbrooks 6.8.2012, 14:49
Цитата(LittleCat @  5.8.2012,  22:49 Найти цитируемый пост)
Как передать ему параметры и как получить от него каике либо параметры не прибегая к реализации клиент-сервера.

ну как бэ клиент- сервер кошерный подход в wcf. городить какой то свой маршаллинг не православно. тем не менее попробуй некий разделяемый ресурс. возможно это выход.

Автор: LittleCat 6.8.2012, 15:58
Код

using(ServiceHost host= new ServiceHost(typeof(FFFFF))
{
   host.Open();
}


Ну так и что - мне запускать сервис WCF из сервиса винды а потом и создавать клиента в сервисе винды для доступа к сервису WCF? К тому-же точка доступа net-pipe уже занята дуплексом для общения с внешним сервисом винды. Разделяяемый ресурс? ну так тут можно и через очередь сообщений подвязаться к службе. Может есть способ кошернее чем обвешивать WCF интерфейсами как араба динамитом?



Автор: mrbrooks 6.8.2012, 16:09
wcf является христианским продуктом под .net для распределенных приложений. оно понятно - порою несколько избыточно и тяжеловесно - зато гламурно. просто если менее монстроообразное - можно .NET Remoting, но это уже старье. я бы выбрал, то что проще и удобней, нежели костылеобразное и фееричное.

Автор: LittleCat 8.8.2012, 15:17
Гм. Дас трабл в том, что связь должен инициализироватьклиент  Wcf в данном случае и поддерживать. Однажды отправив запрос в обьект при подключении клиента к нему мне нужен вариант, чтобы сам клиент генерировал данные и присылал а тут получается необходимо выполнят ьпостоянные запросы от клиента. Но как информировать клиента  о смене протокола обмена или точнее сказать о необходимости смена набора данных от клиента к сервису.



Автор: erm0l0v 9.8.2012, 10:23
Wcf есть возможность реализации callback тогда не только клиент будет обращаться в сервису но сервис сможет обратиться к клиенту. Вам ведь это нужно? И к тому же WCF это все лишь общий подход реализующий взаимодействие между некоторым клиентом и сервером, то есть что на клиенте что на сервере будет один общий интерфейс, а уже как будут передаваться данные между клиентом и сервером зависит только от вашей фантазии: по сети, через разделяемую память, да хоть по голубиной почте, нужно только найти Голубь SDK)))

Автор: LittleCat 9.8.2012, 12:59
Господа. Прошу прощения сразу за мою неосведомленность. Опыта мало еще в этом вопросе. Но мне не удается обьяснить точно что я хочу. Я знаю что есть колбэк и использую его. Описываю ситуацию.
Есть сервис винды. Написан мной. Работает как OPC( берет данные из определнного источника)  клиент и складирует данные в базу. Сам работает прекрасно. Теперь есть необходимость отобразить эти данные "в режиме реального времени" на клиентах. Ок. для этого используем TCP и дуплекс( в данном конкретном используется дуплекс канальный, так как клиентом является другой сервис - фасад). Клиент выполняет запрос о том, какие данные ему нужны. Клиенту отображается лишь допустим 2 элемента массива данных, которые сервис архивирует в базу. Итак имеем - нужно отображать 2 элемента массива  для клиента. Ок. Прислали от клиента параметр выбора. Сформировали ( должны сформировать ответ от сервиса и выкинуть через WCF обратно клиенту. ВОт тут и жопа. Напрямую передать от WCF  к сервису винды данные и соответственно получит я не могу( не умею). А использовать канал связи клиент-сервер муторно. Учитывая что это только часть, а сервисов работает на машине уже 3 штуки.

Код

// window service class   
 public partial class SyncSiemensService : ServiceBase
    {
        private OpcServiceClass opcServer = new OpcServiceClass();
        
        public SyncSiemensService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
                  // OPC client- database client object
                  opсServer.Start();

                 // WCF interface for external communication 
                 // with this windows service
                  using (ServiceHost host = new ServiceHost(typeof(DuplexPipeWcfService)))
                             {
                                 host.Open();
                              }
        }
}


собственно я так понимаю что после поднятия интерфейса в OnStart вы предлагаете связывать opcServer обьект с сервисом WCF дуплексом. вот и вопрос - есть ли способ проще.
Ну или посоветуйте господа другую концепцию. Сижу уже 3 день -  не могу придумать нифига и в нете не нашел пока.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)