2012-05-18 1 views
1

Я успешно реализовал автономную службу WCF. Для устаревших вопросов конфигурация привязки хоста считывается из нестандартного источника (вместо app.config). При переносе этой службы в IIS я сталкиваюсь с проблемой загрузки параметров, и я обнаружил, что решение предполагает реализацию класса, унаследованного от ServiceHostFactory.WCF - Внедрение ServiceHostFactory для использования в контексте IIS (файл svc)

Моя проблема состоит в том, что метод CreateServiceHost получает только конкретный тип и URI из SVC-файла, но я хотел бы повторно использовать этот класс для дальнейших внедрений и нуждаться в дополнительной информации: например, интерфейс, который определяет ServiceContract и привязка уже настроена.

Я нашел this excellent article от @carlosfigueira, но его реализация использует фабрику, чтобы вернуть хост, специфичный для службы, в соотношении 1 к 1. Я уверен, что смогу это сделать, но это приведет к нескольким конкретным фабрикам, с большим количеством кода копирования и вставки, и я бы избегал этого. Является ли это возможным? Если да, то как я могу это сделать?

+0

Ваш завод по обслуживанию, когда он получает конкретную услугу, должен иметь возможность разрешить эту информацию, нет? –

+0

Поскольку атрибут 'ServiceContract' не наследуется, я предполагаю, что мне нужно передать интерфейс, который объявляет его (вместо конкретного класса), при выполнении метода AddServiceEndpoint. Кроме того, мне нужен еще один параметр для загрузки правильных настроек привязки. Интересно, могу ли я передать дополнительные параметры в ServiceHostFactory ... –

+0

Редактировать вопрос с немного дополнительной информацией о том, что вы пытаетесь выполнить, мне трудно понять, что именно вы хотите. Я использую единый произвольный завод, и он проходит в конкретном классе, но конфигурация выполняется в web.config. –

ответ

1

Нет встроенного способа узнать, какие контракты реализованы классом обслуживания, но код не должен быть слишком сложным. Это что-то похожее на функции ниже. Вам понадобится логика определения относительного адреса, если у вас несколько типов контрактов (т. Е. Если у вас есть один контракт, используйте «», если у вас несколько, используйте имя контракта в качестве адреса).

private IEnumerable<Type> GetContractType(Type serviceType) 
{ 
    if (HasServiceContract(serviceType)) 
    { 
     yield return serviceType; 
    } 

    var contractInterfaceTypes = serviceType.GetInterfaces() 
     .Where(i => HasServiceContract(i)); 

    foreach (var type in contractInterfaceTypes) 
    { 
     yield return type; 
    } 

    // if you want, you can also go to the service base class, 
    // interface inheritance, etc. 
} 

private static bool HasServiceContract(Type type) 
{ 
    return Attribute.IsDefined(type, typeof(ServiceContractAttribute), false); 
} 
+0

Привет, @carlosfigueira, спасибо за ваше предложение. Я уже подозревал, что мне нужно было dwelve в Reflection, чтобы рекурсивно получить базовые классы и реализованные интерфейсы (я уже что-то делаю, чтобы экспортировать известные типы сервиса), но я бы предпочел избежать этого, потому что это затрудняет чтение кода. Полагаю, что я собираюсь придерживаться более простого решения для создания фабрики, специфичной для каждого SVC-файла, поэтому я заранее знаю, какой ключ использовать для загрузки настроек и какой ServiceContract реализован. Иногда я очень разочарован WCF ... –

 Смежные вопросы

  • Нет связанных вопросов^_^