2010-03-23 4 views
4

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

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

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

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

А затем container.RegisterType<UnityServiceHost>(new InjectionConstructor(new ResolvedParameter<Type>("ServiceName"))); для регистрации ServiceHost.

Любые лучшие решения там? Я, наверное, в моих предположениях.

С наилучшими пожеланиями,
Майкл

ответ

3

Использование Constructor Injection телеграфировать вашу реализацию службы, так же, как вы бы с любым другим классом.

Here's a writeup on how to make WCF understand Constructor Injection.

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

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

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

Да, мне не нравится проходить вокруг контейнера. Вместо этого я попытаюсь использовать дженерики. – Michael

+0

В какой момент времени GetInstance вызывает InstanceProvider? Когда я открываю хост службы? – Michael

+0

Вы будете пропускать контейнер только в тех трех классах WCF (ServiceHostFactory, ServiceHost и IInstanceProvider). Это вряд ли является анти-шаблоном Service Locator - это просто инфраструктура DI. Вы даже можете создать универсальную библиотеку, которая обертывает Unity. WcfFacility Castle Windsor делает именно это. Чтобы ответить на ваш другой вопрос: GetInstance вызывается каждый раз, когда вызывается операция службы. –

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