Как переместить ссылки на службы в их собственную сборку?

Немного предыстории:

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

Пока что у меня есть 3 сборки, которые представляют:

  • Сборка, содержащая основную библиотеку адаптера: она содержит
    • Определение интерфейса для каждого из адаптеров
    • Базовые классы
    • Фабрика классов для создания экземпляра указанного адаптера во время выполнения.
  • Сборка для каждой реализации сетевого адаптера.
  • Сборка, содержащая мое основное приложение.

Учитывая, что я не хочу добавлять ссылки на службы и их конфигурацию в основную сборку приложения [поскольку это не относится к основному приложению], как мне заставить ссылку службы каждой сборки получать свою конфигурацию из ее собственного app.config?

Если у меня есть эталонная конфигурация службы в главном app.config, все работает нормально, но если я перенесу конфигурацию в app.config адаптера, все перестанет работать, вызывая следующее исключение в точке, где я создаю Soap1Client.

"Could not find default endpoint element that references contract 'MobileService.Service1Soap' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element."

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
502
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не верю, что для этого существует встроенный в .NET способ. Однако вы должны иметь возможность выполнить это, написав некоторый код для анализа файла .config каждой сборки, на которую имеется ссылка.

Вот пример использования файлов конфигурации для конкретной сборки, который должен указать вам правильное направление: http://www.bearcanyon.com/dotnet/#AssemblySettings.

Я сделал нечто подобное в приложении .NET Winforms, и это сработало.

Я проверил настройки конфигурации для каждой сборки, на которые ссылается статья, и не понимаю, как это может работать в этой ситуации. Мне нужно найти способ управлять файлом конфигурации, на который ссылается ссылка на службу.

BenAlabaster 23.01.2009 17:20

Вы можете установить все параметры программно.

Ответ принят как подходящий

В конце концов, я просто удалил ссылку на сервис и добавил веб-ссылку [т.е. сделал это способом 2.0]. По какой-то причине веб-ссылка будет обращаться к собственному app.config вместо app.config основного приложения.

Намного проще, чем альтернатива ...

Если вам необходимо, чтобы библиотека считывала конфигурацию службы из файла конфигурации, возможно, вам не повезло. Библиотека становится частью процесса, и процесс использует конфигурацию приложения, которое инициировало процесс.

Однако в своей библиотеке вы можете использовать одну из перегрузок конструктора прокси-класса ссылки на службу для динамической установки конфигурации при создании экземпляра ссылки на службу. Тогда вам не обязательно иметь конфигурацию привязки ссылки на службу в каком-либо файле конфигурации. Используемая мной перегрузка принимает два параметра: System.ServiceModel.Channels.Binding binding и System.ServiceModel.EndpointAddress remoteAddress. Обратите внимание, что класс Binding - это абстрактный класс, вы должны использовать один из классов, которые унаследованы от него - вы можете найти их список здесь: https://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding(v=vs.110).aspx.

Для простой ссылки на службу http я использую экземпляр класса BasicHttpBinding по умолчанию и создаю экземпляр класса EndpointAddress, используя URL-адрес службы, на которую я ссылаюсь. Очевидно, вам придется изменить это, чтобы использовать https или защищенные службы и т. д.

Конечно, все еще возникает вопрос, как библиотека получает правильный URL-адрес службы, если вы не хотите жестко кодировать его в библиотеке? Есть несколько способов прочитать его из базы данных или известного местоположения файла.

Другие вопросы по теме