Немного предыстории:
Я создаю набор адаптеров для связи с мобильными устройствами по разным сотовым сетям. Это будет достигнуто с помощью шаблона фабрики классов. По крайней мере, для одной из сетей требуется ссылка на службу для связи со своими устройствами через веб-службу.
Пока что у меня есть 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."





Я не верю, что для этого существует встроенный в .NET способ. Однако вы должны иметь возможность выполнить это, написав некоторый код для анализа файла .config каждой сборки, на которую имеется ссылка.
Вот пример использования файлов конфигурации для конкретной сборки, который должен указать вам правильное направление: http://www.bearcanyon.com/dotnet/#AssemblySettings.
Я сделал нечто подобное в приложении .NET Winforms, и это сработало.
Вы можете установить все параметры программно.
В конце концов, я просто удалил ссылку на сервис и добавил веб-ссылку [т.е. сделал это способом 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-адрес службы, если вы не хотите жестко кодировать его в библиотеке? Есть несколько способов прочитать его из базы данных или известного местоположения файла.
Я проверил настройки конфигурации для каждой сборки, на которые ссылается статья, и не понимаю, как это может работать в этой ситуации. Мне нужно найти способ управлять файлом конфигурации, на который ссылается ссылка на службу.