Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.234.83] |
|
Сообщ.
#1
,
|
|
|
Добрый день. Если форма, на которой две кнопки (старт и стоп, которые запускают и останавливают службу)
Вот ее код: 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; } } } И есть класс, реализующий саму службу: 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? |
Сообщ.
#2
,
|
|
|
Метобы еще параметры могут иметь.
|
Сообщ.
#3
,
|
|
|
Цитата SPM @ Метобы еще параметры могут иметь. Пример можно конкретно под мою ситуацию? |
Сообщ.
#4
,
|
|
|
И еще вопрос:
Как вызавать методы главного класса ServicesMainForm из создаваемого класса WCFServices? |
Сообщ.
#5
,
|
|
|
[OperationContract] double Add(double p1, double p1); public double Add(double p1, double p1) { return p1 + p2; } Добавлено Цитата lutikman @ Как вызавать методы главного класса ServicesMainForm из создаваемого класса WCFServices? Кто такой WCFServices? |
Сообщ.
#6
,
|
|
|
Цитата SPM @ [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? |
Сообщ.
#7
,
|
|
|
Цитата lutikman @ Т.е. проблема в том что те инт а эти доубле или ? еще раз пожалуйста с акцентом. вопрос с акцентом Цитата lutikman @ Никак. из создаваемого класса CalculatorService Добавлено Цитата lutikman @ переменные Это не переменные. |
Сообщ.
#8
,
|
|
|
Цитата SPM @ Цитата lutikman @ Т.е. проблема в том что те инт а эти доубле или ? еще раз пожалуйста с акцентом.вопрос с акцентом На сколько я понимаю методы класса CalculatorService вызываются из клиентского приложения. Через эти методы мне нужно клиентскому приложению вернуть данные главного класса ServicesMainForm. Как это сделать? |
Сообщ.
#9
,
|
|
|
Цитата lutikman @ На сколько я понимаю методы класса CalculatorService вызываются из клиентского приложения. Через эти методы мне нужно клиентскому приложению вернуть данные главного класса ServicesMainForm. Как это сделать? Это можно сделать реализовав ICalculator в классе ServicesMainForm, объединив таким образом веб- и вин- сервисы в одном классе. Либо создав третий, статический, класс для хранения общей информации. В обоих случаях необходимо будет позаботиться о потоках и доступе к разделяемому ресурсу - у вин-сервиса свой поток, а у WCF-сервиса свой (свои). |
Сообщ.
#10
,
|
|
|
ServicesMainForm тоже может быть клиентом вашего сервиса. Расширте интерфейс так чтобы он мог принимать данны и от вашего ServicesMainForm.
Тогда она будет засылать туда данные, а другие клиенты их будет вынимать. |
Сообщ.
#11
,
|
|
|
При создании ServiceHost используйте конструктор принимающий не тип сервиса а объект ServiceHost(Object, array<Uri>[])ServiceHost(Object, array<Uri>[])
Т.е. сперва создаете сервис передаете ему ссылку на форму и передаете сервис хосту calcServ = new CalculatorService(); calcServ.ServForm = this; selfHost = new ServiceHost(calcServ , baseAddress); if (selfHost != null) { if (selfHost .State != selfHost .Closed) selfHost .Close(); selfHost = null; } if (calcServ != null) { calcServ .Dispose(); calcServ = null; } Добавлено Второй вариант использовать статическое поле public static ServicesMainForm servMainForm; public ServicesMainForm() { InitializeComponent(); servMainForm = this; } соответственно в сервисе ServicesMainForm.servMainForm.varA // только их надо сделать public |