Могу ли я автоматически размещать все службы в app.config при использовании SelfHosting?

Я пишу приложение, в котором необходимо разместить несколько служб WCF. Одной из сильных сторон WCF является возможность настраивать службы без необходимости перекомпиляции, путем указания параметров в файле app.config.

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

Однако мои сервисы, контракты и хостинговое приложение - все в разных сборках. Это приводит к тому, что Type.GetType (имя строки) не может найти мой тип службы (возвращает null ), потому что он определен в другой сборке.

Как я могу надежно разместить все службы, перечисленные в файле app.config динамически (т. е. без жесткого кодирования нового ServiceHost (typeof (MyService)) в моем приложении для самостоятельного размещения?

Примечание. Мой app.config был создан с использованием «Редактор конфигурации WCF» в Visual Studio 2010.

Также обратите внимание: моя основная цель - сделать это управляемым приложением. config, чтобы иметь единую точку настройки. Я не хочу настраивать это в отдельном месте.

РЕДАКТИРОВАТЬ : я могу читать файл app.config (см. здесь ), но мне нужно иметь возможность разрешать типы в разных сборках.

РЕДАКТИРОВАТЬ : Один из ответов ниже побудил меня попробовать указать AssemblyQualifiedName в app.config вместо простого имени базового типа. Это позволило обойти проблему Type.GetType () , однако ServiceHost.Open () теперь выдает ошибку InvalidOperationException независимо от того, как я получил тип :

// Fails
string typeName = typeof(MyService).AssemblyQualifiedName;
Type myType = Type.GetType(typeName);
ServiceHost host = new ServiceHost(myType);
host.Open(); // throws InvalidOperationException

// Also fails
Type myType2 = typeof(MyService);
ServiceHost host2 = new ServiceHost(myType2);
host2.Open(); // throws InvalidOperationException

Сведения об исключении:

Служба SO.Example.MyService не имеет конечных точек приложения (не связанных с инфраструктурой). Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или из-за того, что в файле конфигурации не может быть найден ни один элемент службы, соответствующий имени службы, или из-за того, что в элементе службы не определены конечные точки.

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

РЕДАКТИРОВАТЬ / ОТВЕТ : То, что я сделал, было в основном тем, что было в ответе ниже. Вместо использования Type.GetType () я знаю, что все мои службы находятся в одной сборке, поэтому я переключился на:

// Get a reference to the assembly which contain all of the service implementations.
Assembly implementationAssembly = Assembly.GetAssembly(typeof(MyService));
...
// When loading the type for the service, load it from the implementing assembly.
Type implementation = implementationAssembly.GetType(serviceElement.Name);

7
задан Community 23 May 2017 в 12:16
поделиться