WCF и Unity - внедрение зависимостей - PullRequest
4 голосов
/ 23 марта 2010

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

Я бы хотел решение, где контейнер не передается (не тесно связан с Unity). Где я не использую конфигурационный файл для настройки контейнера и где я использую сервисы, размещенные самостоятельно.

Проблема в том, как я понимаю, в том, что ServiceHost принимает тип реализации службы в качестве параметра, так что же отличается от использования InstanceProvider?

Решение, которое я нашел на данный момент, состоит в том, чтобы зарегистрировать ServiceHost (или специализацию) для регистрации типа с именем (например, container.RegisterInstance<Type>("ServiceName", typeof(Service);).

А затем container.RegisterType<UnityServiceHost>(new InjectionConstructor(new ResolvedParameter<Type>("ServiceName")));, чтобы зарегистрировать ServiceHost.

Есть ли лучшие решения там? Я, пожалуй, в своих предположениях.

С уважением,
Michael

1 Ответ

3 голосов
/ 23 марта 2010

Используйте Конструктор Injection , чтобы подключить реализацию сервиса, как вы это делали бы с любым другим классом.

Вот описание того, как WCF понимает Конструктивное внедрение .

Пример в этом ответе демонстрирует Инъекция бедного человека , но вы можете экстраполировать его и настроить экземпляр UnityContainer в ServiceHostFactory вместо жестко закодированной зависимости.

Вы полностью передаете экземпляр контейнера пользовательскому IInstanceProvider.Теперь вы можете использовать контейнер в методе GetInstance:

public object GetInstance(InstanceContext instanceContext)
{
    var serviceType = instanceContext.Host.Description.ServiceType;
    return this.container.Resolve(serviceType);
}
...