| 
 | 
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  Есть винформс клиент, он работает с ->WCF Service1, т.е. есть референсе на сервис и  public MyServiceReference.MyDataServiceClient client; с этим клиентом много кода. Суть вопроса: Как сделать так, чтобы приложение работало с несколькими версиями сервиса? Т.е. сервисы отличается некоторыми параметрами, как сделать как-то так, скажем цепляю референсы на три версии сервиса public MyServiceReference.MyDataServiceClient1 client1; public MyServiceReference.MyDataServiceClient2 client2; public MyServiceReference.MyDataServiceClient3 client3; Но в коде везде используется переменная client, можно ли использовать одну переменную client? или как-то по-другому? ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 14.04.2021, 17:42 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  Ролг Хупин Есть винформс клиент, он работает с ->WCF Service1, т.е. есть референсе на сервис и  public MyServiceReference.MyDataServiceClient client; с этим клиентом много кода. Суть вопроса: Как сделать так, чтобы приложение работало с несколькими версиями сервиса? Т.е. сервисы отличается некоторыми параметрами, как сделать как-то так, скажем цепляю референсы на три версии сервиса public MyServiceReference.MyDataServiceClient1 client1; public MyServiceReference.MyDataServiceClient2 client2; public MyServiceReference.MyDataServiceClient3 client3; Но в коде везде используется переменная client, можно ли использовать одну переменную client? или как-то по-другому? чего? расшифруйте как вы собрались использовать одну переменную client на три разных класса? из того что я понял вам нужна какая то обертка которая будет создавать тот или иной инстанс прокси-клиента или нет? ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 14.04.2021, 17:59 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  felix_ff Ролг Хупин Есть винформс клиент, он работает с ->WCF Service1, т.е. есть референсе на сервис и  public MyServiceReference.MyDataServiceClient client; с этим клиентом много кода. Суть вопроса: Как сделать так, чтобы приложение работало с несколькими версиями сервиса? Т.е. сервисы отличается некоторыми параметрами, как сделать как-то так, скажем цепляю референсы на три версии сервиса public MyServiceReference.MyDataServiceClient1 client1; public MyServiceReference.MyDataServiceClient2 client2; public MyServiceReference.MyDataServiceClient3 client3; Но в коде везде используется переменная client, можно ли использовать одну переменную client? или как-то по-другому? чего? расшифруйте как вы собрались использовать одну переменную client на три разных класса? из того что я понял вам нужна какая то обертка которая будет создавать тот или иной инстанс прокси-клиента или нет? в том-то и вопрос: можно ли использовать одну переменную, чтобы не переписывать код. Эти классы сильно похожи, скажем так: каждая новая версия является суперсетом предыдущей. Т.е. я ничего не выбрасываю, только добавляю. Другими словами - какой подход можно использовать? Кроме лобового: if(version==1) client1.... else if(version==2) client2... else client3... ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 14.04.2021, 21:14 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  Ролг Хупин, ну используйте dynamic обойдете проверку статической типизации тогда. ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 14.04.2021, 21:17 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  Все классы, создаваемые при добавлении service reference, студия объявляет как partial - т.е. им можно задать свою иерархию интерфейсов. Допустим, в проект импортировано 3 версии сервиса с неймспейсами FooServiceReference1, FooServiceReference2, FooServiceReference3. Созданный при импорте код выглядит как-то так (атрибуты для простоты убрал): Код: c# 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. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. Где-нибудь сбоку объявляем свои интерфейсы с тем же набором методов, что и у сервисов, и унаследованные друг от друга: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. и в отдельном исходнике привязываем интерфейсы к классам сервисов: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Теперь этим хозяйством можно пользоваться через общую иерархию интерфейсов: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. (ну, или там запихать экземпляры сервисов в какой-нить диконтейнер по типам реализуемых интерфейсов, итп.) Код: c# 1. 2. 3. 4. 5. 6. 7. ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 15.04.2021, 07:20 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  2 Сон Веры Павловны, ух, жесть, спасибо, ушел разбираться, если что - вернусь с вопросами ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 15.04.2021, 11:31 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  Сон Веры Павловны, вопрос: Как быть если мне нужна глобальная переменная zot? Т.е. я сначала определяюсь с какой версией сервиса я работаю, потом вызываю Factory Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 20.04.2021, 16:57 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  felix_ff Ролг Хупин, ну используйте dynamic обойдете проверку статической типизации тогда. как это проделать в свете моего вопроса юзеру Сон Веры Павловны? Т.е. если локальная переменная ,тогда сойдет так Код: c# 1. 2. 3. 4. 5. 6. 7. а если мне нужна глобальная переменная клиент сервиса, которая будет создана как один из типов FooServiceFactory.Create<IZot>(); и будет использоваться затем в других функциях - как объявить? ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 21.04.2021, 12:32 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  Ролг Хупин а если мне нужна глобальная переменная клиент сервиса, которая будет создана как один из типов FooServiceFactory.Create<IZot>(); и будет использоваться затем в других функциях - как объявить? Выше же писал: использовать диконтейнер. Ну, там нинжект какой-нибудь: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. и дальше уж как нравится - инжектить клиента как зависимость, если хочется по фэншую, или дергать ServiceFactory.Get<IZot>(), если хочется по рабоче-крестьянски. Autofac, насколько я помню, такие вещи позволяет определять в конфиге. ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 21.04.2021, 13:25 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  Сон Веры Павловны Ролг Хупин а если мне нужна глобальная переменная клиент сервиса, которая будет создана как один из типов FooServiceFactory.Create<IZot>(); и будет использоваться затем в других функциях - как объявить? Выше же писал: использовать диконтейнер. Ну, там нинжект какой-нибудь: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. и дальше уж как нравится - инжектить клиента как зависимость, если хочется по фэншую, или дергать ServiceFactory.Get<IZot>(), если хочется по рабоче-крестьянски. Autofac, насколько я помню, такие вещи позволяет определять в конфиге. ясно, еще один вопрос: в реальной жизни я добавляю ссылку на сервис и на сервис2. Результат генерации: два фолдера с кучей файлов, включая в каждом Reference.cs Я понял, в чем разница между моим и вашим описанием. Мои обе ссылки на сервисы независимы, т.е. они не выведены из общих интерфейсов и классов. Поэтому,такое определение Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Вызываю: myclient = DAServiceFactory<IMySReference1.IDAService>(bin, ep) пишет ошибку, авторThe type 'IMySReference1.IDAService' cannot be used as type parameter 'T' in the generic type or method 'DataAccessServiceFactory.Create<T>(Binding, EndpointAddress)'. There is no implicit reference conversion from 'IMySReference1.IDAService' to 'IMySReference.IDAService'. т.е. понимаю, что как в вашем примере интерфес должен быть выведен из общего, но я использую файлы сгенерированные wsdl и не хотелось бы руками там шастать ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 21.04.2021, 14:02 | 
  
  
  
   | 
||
| 
 
Клиент->WCF Service1, ->WCF Service2,->WCF Service3 
 | 
|||
|---|---|---|---|
| 
 #18+ 
    
  Ролг Хупин т.е. понимаю, что как в вашем примере интерфес должен быть выведен из общего, но я использую файлы сгенерированные wsdl и не хотелось бы руками там шастать Там не надо шастать руками. Я же выше писал - то что создается по wsdl, создается с модификатором partial. Это позволяет в любом расположении в том же проекте создать исходник, в нем в аналогичном неймспейсе создать класс с тем же именем и модификатором partial, и у него задать нужные интерфейсы. Автосгененированные исходники при этом останутся нетронутыми. ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 21.04.2021, 14:38 | 
  
  
  
   | 
||
| 
 | 

start [/forum/topic.php?desktop=1&fid=19&tid=1396636]:  | 
    0ms | 
get settings:  | 
    11ms | 
get forum list:  | 
    15ms | 
check forum access:  | 
    4ms | 
check topic access:  | 
    4ms | 
track hit:  | 
    37ms | 
get topic data:  | 
    14ms | 
get forum data:  | 
    3ms | 
get page messages:  | 
    52ms | 
get tp. blocked users:  | 
    2ms | 
| others: | 14ms | 
| total: | 156ms | 

| 0 / 0 | 

На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даете согласие с использованием данных технологий.