Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / общий класс у Web Service и клиента / 19 сообщений из 19, страница 1 из 1
17.04.2009, 00:55
    #35937549
pion3r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Доброго времени суток.
Есть ASP Web Service и WinForms приложение. Например на сервайсе есть классы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
class Car
{
     private Int32 id;
     public Int32 ID
     {
         get
         {
             return id;
         }
         set
         {
             id = value;
         }
     }
     private String name;
     public String Name
     {
         get
         {
             return name;
         }
         set
         {
             name = value;
         }
     }
}

class Cars 
{
    public List<Car> listOfCars;
    public Cars()
    {
        //---------- реализация и тд..
    }
}

эти же классы есть и на клиентском приложении. Возможно ли как то сделать что бы когда я прогруженный данными обьект типа Cars полученый с сервера, просто взял и присвоил локальному обьекту также типа Cars. Заранее благодарен.
...
Рейтинг: 0 / 0
17.04.2009, 00:59
    #35937552
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Это называется DataContract
...
Рейтинг: 0 / 0
22.04.2009, 15:58
    #35947488
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
pion3r,

Можно через конструктор:

В описании контракта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[DataContract]
public class CarWS
{
  [DataMember]
  public int ID;
}

public class CarsWS
{
  [DataMember]
  public List<CarWS> listOfCars;
}

На клиенте:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class Car
{
  public Car(CarWS carWS)
  {
    this.ID = carWS.ID;
  }
  public int ID {get; private set;}
}

public class Cars
{
  public Cars(CarsWS carsWS)
  {
    Cars = new List<Car>();
    foreach(CarWS carWS in carsWS)
      Cars.Add(new Car(carWS));
  }
  public List<Car> Cars;
}


Ну и далее в коде:
Код: plaintext
1.
2.
3.
4.
void CarsReceivedFromWS(CarsWS carsWS)
{
  Cars cars = new Cars(carsWS);
  ...
}
...
Рейтинг: 0 / 0
22.04.2009, 16:16
    #35947550
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
в WCF такое можно сделать, в вебсервисах - только так как показал Roman S. Golubin
переходите на WCF
...
Рейтинг: 0 / 0
22.04.2009, 16:24
    #35947587
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Gatman,

Собственно, я для WCF и показал :) У вас какой-то другой вариант есть? Делитесь.
...
Рейтинг: 0 / 0
22.04.2009, 16:28
    #35947609
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
есть. при добавлении сервис референс в адвансед галочка - reuse types in referenced assemblies, ну и референсы на сборку с типами. тогда компилятор везде подставляет типы, которые в самой сборке
...
Рейтинг: 0 / 0
22.04.2009, 16:31
    #35947624
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Gatman,

хмм... добавление сервис референс... излишняя процедура, создающая кучу (в 90% случаев) неюзабельного в дальнейшем кода... имхо.
...
Рейтинг: 0 / 0
22.04.2009, 16:36
    #35947650
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
ну, в случае установки этой галочки, кода становится в разы меньше
глянуть сейчас не могу, но если не ошибаюсь, у меня генерилось по 1 или 2 файла на каждый сервис, файлы назвать большими я не могу. другое дело что при обновлениях референсов могут добавляться новые файлы, в то время как старые перестают использоваться. но тут нужно просто почистить папку с референсами (я обычно просто удаляю всё и пересоздаю их)
а главное - руками писать ничего не нужно, просто создал прокси-класс и вызвал метод, передав нужный класс.
...
Рейтинг: 0 / 0
22.04.2009, 16:46
    #35947683
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Gatman,

руками писать не нужно - это как? Как минимум, генерилка тогда должна знать какие локальные классы (и как) на классы контрактов отражать, иначе может такого нагенерить.
Или мы о разных вещах говорим? Если речь идет о повторном использовании одного и того же класса контракта, то все просто - вынести контракты в отдельную сборку и подключать ее и к серверному и к клиентскому коду.
...
Рейтинг: 0 / 0
22.04.2009, 16:54
    #35947720
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
так в том то и дело, что используются одни и те же классы что на сервисе, что на клиенте.
т.е. если есть сервис возвращает SomeType, то и на клиенте мы получаем сразу же именно этот SomeType, а не SomeTypeWS, сгенеренный при добавлении сервис
MSDN
MSDNWhen a service reference is added to a project, any types defined in the service are generated in the local project. In many cases, this creates duplicate types when a service uses common .NET Framework types or when types are defined in a shared library.
To avoid this problem.......
...
Рейтинг: 0 / 0
22.04.2009, 16:57
    #35947730
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
т.е. классы не генерятся, а используется то что есть.
...
Рейтинг: 0 / 0
22.04.2009, 17:01
    #35947741
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
кстати, сейчас присмотрелся к коду, который Вы привели выше. я правильно понял, что сборка, содержащая Car имеет ссылку на веб-сервис? и при это сам веб-сервис имеет ссылку на сборку, содержащую Car, т.к. он использует его внутри своих методов?
...
Рейтинг: 0 / 0
22.04.2009, 17:02
    #35947749
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Gatman,

Хм... а я по наивности просто сборку с контрактами подключаю и получаю теже самые классы, что и в сборке контрактов, но они мне не нужны, так как на сервере и на клиенте у них в 90% случаев разная функциональность. Поэтому я из них в локальные классы данные и перекладываю А у вас с генерилкой, оказывается, проблема обратная - как из нагенеренных классов в классы контракта данные переложить ;-D
...
Рейтинг: 0 / 0
22.04.2009, 17:07
    #35947766
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Gatmanкстати, сейчас присмотрелся к коду, который Вы привели выше. я правильно понял, что сборка, содержащая Car имеет ссылку на веб-сервис? и при это сам веб-сервис имеет ссылку на сборку, содержащую Car, т.к. он использует его внутри своих методов?

Имеем: сборка с датаконтрактами, сервис со ссылкой на сборку с контрактами, клиента со ссылкой на сборку с контрактами.
...
Рейтинг: 0 / 0
22.04.2009, 17:15
    #35947797
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Roman S. GolubinА у вас с генерилкой, оказывается, проблема обратная - как из нагенеренных классов в классы контракта данные переложить ;-Dну так проблемы собственно никакой нет. везде используются одни и те же классы. удобно, имеем одинаковую бизнес логику и на сервисе, и на клиенте. как следствие, что можно сделать на клиенте, делается на нём, и нет никаких накладных издержек на запрос к сервису.
...
Рейтинг: 0 / 0
22.04.2009, 17:16
    #35947802
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Roman S. GolubinGatmanкстати, сейчас присмотрелся к коду, который Вы привели выше. я правильно понял, что сборка, содержащая Car имеет ссылку на веб-сервис? и при это сам веб-сервис имеет ссылку на сборку, содержащую Car, т.к. он использует его внутри своих методов?

Имеем: сборка с датаконтрактами, сервис со ссылкой на сборку с контрактами, клиента со ссылкой на сборку с контрактами.т.е. у Вас логика на клиенте?
...
Рейтинг: 0 / 0
22.04.2009, 17:21
    #35947828
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Gatman,

на сервере своя логика, на клиенте своя. На клиенте логика по отображению данных - синхронизация контекстов с UI и т.п., на сервере логика по обработке данных :) А в датаконтракте какая логика? Там ни какой логики - только данные для передачи между сервером и клиентом. Поэтому на клиенте и приходится мапить классы контракта в классы клиента.
...
Рейтинг: 0 / 0
22.04.2009, 17:25
    #35947845
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
а попробуйте как я писал, Вам понравится, ничего мапить не надо. и аттрибуты типа DataContract и DataObject тоже можно не использовать, WCF хватает если класс помечен как XmlSerializable
...
Рейтинг: 0 / 0
22.04.2009, 17:31
    #35947887
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
общий класс у Web Service и клиента
Gatman,

да нет, спасибо, я лучше по старинке - ручками без генераторов - точно знаешь, что получится в итоге, в отличие от :)
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / общий класс у Web Service и клиента / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]