Конструктор WCF Тип сервиса через DI - PullRequest
0 голосов
/ 09 июля 2011

В настоящее время я пытаюсь создать небольшой сервер приложений, на котором будут размещаться несколько служб WCF. Эти службы (и, конечно, их зависимости) должны создаваться с помощью контейнера DI / IoC (в настоящее время LightCore, но, поскольку я использую его через CommonServiceLocator, его легко обменять). К сожалению, я наткнулся на проблему. Очевидно, я должен создать экземпляры ServiceHost для размещения упомянутых служб WCF. Я уже создал настраиваемый InstanceProvider и ServiceBehavior для обработки всех зависимостей сервисов, НО Конструктору ServiceHost необходим Тип сервиса сервиса для размещения. На данный момент в моей программе я знаю только интерфейсный тип, поскольку только контейнер DI знает, какая реализация службы используется в настоящее время.

Дешевым методом было бы создать «фиктивный» экземпляр типа сервиса через Service Locator и дать конструктору ServiceHost вывод myDummyInstance.GetType (), но это просто больно смотреть, бесполезная реализация и использование Service Локатор вместо DI ... должен быть лучший способ.

Есть идеи у кого-нибудь? :)

1 Ответ

0 голосов
/ 09 июля 2011

Есть несколько способов сделать это.

  • Мне нравится очень просто.Вы не будете заключать договор на обслуживание, а будете сами внедрять сервис, потому что именно этого ожидает WCF.Все контейнеры IoC, которые я использовал, могут разрешать сам тип и заполнять его зависимости.
  • Другой способ - немного больше взломать.Когда вы вызываете конструктор сервисного хоста, вы будете определять тип сервисного контракта, например, ServiceLocator.Resolve<IContract>().GetType().Это уродливо, но гораздо более чисто, чем создание фиктивных реализацийБолее того, вы никогда не знаете, если переданный тип не используется для чего-то другого в инфраструктуре, поэтому передача фиктивного типа может быть опасной.
...