|
Клиент->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?fid=19&msg=40062532&tid=1396636]: |
0ms |
get settings: |
12ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
50ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
193ms |
get tp. blocked users: |
1ms |
others: | 361ms |
total: | 628ms |
0 / 0 |