На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> WCF Реализация служб , Передача параметров
    Добрый день. Если форма, на которой две кнопки (старт и стоп, которые запускают и останавливают службу)
    Вот ее код:

    ExpandedWrap disabled
      namespace WCFServices
      {
          public partial class ServicesMainForm : Form
          {
              private double varA = 10;
              private double varB = 20;
              private ServiceHost selfHost;
              private Uri baseAddress = new Uri("http://localhost:8000/WCFServices/");
       
              public ServicesMainForm()
              {
                  InitializeComponent();
              }
       
              private void bStartCalc_Click(object sender, EventArgs e)
              {
                  selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
                  try
                  {
                      selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
                      ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                      smb.HttpGetEnabled = true;
                      selfHost.Description.Behaviors.Add(smb);
                      selfHost.Open();
                      bStopCalc.Enabled = true;
                      bStartCalc.Enabled = false;
                  }
                  catch (CommunicationException ce)
                  {
                      selfHost.Abort();
                      bStopCalc.Enabled = false;
                      bStartCalc.Enabled = true;
                  }
              }
       
              private void bStopCalc_Click(object sender, EventArgs e)
              {
                  selfHost.Close();
                  bStopCalc.Enabled = false;
                  bStartCalc.Enabled = true;
              }
          }
      }


    И есть класс, реализующий саму службу:
    ExpandedWrap disabled
      namespace WCFServices
      {
          [ServiceContract(Namespace = "http://WCFServices")]
          public interface ICalculator
          {
              [OperationContract]
              double Add();
              [OperationContract]
              double Subtract();
              [OperationContract]
              double Multiply();
              [OperationContract]
              double Divide();
          }
       
          public class CalculatorService : ICalculator
          {
              private double n1 = 0;
              private double n2 = 0;
       
              public double Add()
              {
                  return n1 + n2;
              }
       
              public double Subtract()
              {
                  return n1 - n2;
              }
       
              public double Multiply()
              {
                  return n1 * n2;
              }
       
              public double Divide()
              {
                  return n1 / n2;
              }
          }
      }


    Вопрос: Как в функции, раелизующие контракты операций (Add(), Subtract(), Multiply(), Divide()) передать переменные (varA, varB) из главного класса ServicesMainForm?
    Сообщение отредактировано: lutikman -
      Метобы еще параметры могут иметь.
        Цитата SPM @
        Метобы еще параметры могут иметь.

        Пример можно конкретно под мою ситуацию?
          И еще вопрос:
          Как вызавать методы главного класса ServicesMainForm из создаваемого класса WCFServices?
            ExpandedWrap disabled
              [OperationContract]
              double Add(double p1, double p1);
               
              public double Add(double p1, double p1)
              {
                  return p1 + p2;
              }


            Добавлено
            Цитата lutikman @
            Как вызавать методы главного класса ServicesMainForm из создаваемого класса WCFServices?

            Кто такой WCFServices?
              Цитата SPM @
              ExpandedWrap disabled
                [OperationContract]
                double Add(double p1, double p1);
                 
                public double Add(double p1, double p1)
                {
                    return p1 + p2;
                }


              Добавлено
              Цитата lutikman @
              Как вызавать методы главного класса ServicesMainForm из создаваемого класса WCFServices?

              Кто такой WCFServices?

              По поводу параметров повторю вопрос с акцентом (жирный текст):
              Как в методы, раелизующие контракты операций (Add(), Subtract(), Multiply(), Divide()) передать переменные (varA, varB) из главного класса ServicesMainForm?


              Ошибся, перепишу вопрос:
              Как вызавать методы главного класса ServicesMainForm из создаваемого класса CalculatorService?
                Цитата lutikman @
                вопрос с акцентом
                Т.е. проблема в том что те инт а эти доубле или ? еще раз пожалуйста с акцентом.
                Цитата lutikman @
                из создаваемого класса CalculatorService
                Никак.

                Добавлено
                Цитата lutikman @
                переменные

                Это не переменные.
                Сообщение отредактировано: SPM -
                  Цитата SPM @
                  Цитата lutikman @
                  вопрос с акцентом
                  Т.е. проблема в том что те инт а эти доубле или ? еще раз пожалуйста с акцентом.

                  На сколько я понимаю методы класса CalculatorService вызываются из клиентского приложения. Через эти методы мне нужно клиентскому приложению вернуть данные главного класса ServicesMainForm.
                  Как это сделать?
                    Цитата lutikman @
                    На сколько я понимаю методы класса CalculatorService вызываются из клиентского приложения. Через эти методы мне нужно клиентскому приложению вернуть данные главного класса ServicesMainForm.
                    Как это сделать?

                    Это можно сделать реализовав ICalculator в классе ServicesMainForm, объединив таким образом веб- и вин- сервисы в одном классе. Либо создав третий, статический, класс для хранения общей информации. В обоих случаях необходимо будет позаботиться о потоках и доступе к разделяемому ресурсу - у вин-сервиса свой поток, а у WCF-сервиса свой (свои).
                      ServicesMainForm тоже может быть клиентом вашего сервиса. Расширте интерфейс так чтобы он мог принимать данны и от вашего ServicesMainForm.
                      Тогда она будет засылать туда данные, а другие клиенты их будет вынимать.
                        При создании ServiceHost используйте конструктор принимающий не тип сервиса а объект ServiceHost(Object, array<Uri>[])ServiceHost(Object, array<Uri>[])
                        Т.е. сперва создаете сервис передаете ему ссылку на форму и передаете сервис хосту
                        ExpandedWrap disabled
                          calcServ = new CalculatorService();
                          calcServ.ServForm = this;
                          selfHost = new ServiceHost(calcServ , baseAddress);


                        ExpandedWrap disabled
                                if (selfHost != null)
                                {
                                  if (selfHost .State != selfHost .Closed)
                                    selfHost .Close();
                                  selfHost = null;
                                }
                           
                                if (calcServ != null)
                                {
                                  calcServ .Dispose();
                                  calcServ = null;
                                }


                        Добавлено
                        Второй вариант использовать статическое поле
                        ExpandedWrap disabled
                                   public static ServicesMainForm servMainForm;
                                
                                   public ServicesMainForm()
                                   {
                                       InitializeComponent();
                                       servMainForm = this;
                                   }


                        соответственно в сервисе
                        ExpandedWrap disabled
                          ServicesMainForm.servMainForm.varA // только их надо сделать public
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0362 ]   [ 16 queries used ]   [ Generated: 2.05.24, 18:40 GMT ]