2010-01-14 3 views
3

У меня есть проект, в котором я экспериментирую с DI. Я использую Unity, и все кажется хорошо работающим для обычных сборок и инъекций.Unity Dependency Injection of WCF service через web.config

Я пытаюсь далее разорвать зависимости с услугами WCF. Службы WCF, что я хочу, чтобы впрыснуть создаются во время выполнения в настоящее время без использования DI и не использовать .net VS генерироваться прокси:

MyService = new ChannelFactory<IMyService>("BasicHttpBinding_IMyService").CreateChannel(); 

конечных точки для вышеперечисленного в web.config:

<endpoint address="http://localhost:35806/MyService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyService" 
     contract="Interfaces.IMyService" name="BasicHttpBinding_IMyService" /> 

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

в web.config нормальное отображение происходит с помощью «МАПТО», где вы будет указывать псевдоним интерфейса и псевдоним для класса, который вы ранее d efined.

<type type="IMyService" mapTo="MyService"> 
<lifetime type="singleton"/> 
</type> 

Поскольку прокси-сервер WCF службы создается динамически во время выполнения, я не эта ссылка на «MyService» класс вместо этого нужно вытащить из "BasicHttpBinding_IMyService" конечной точки службы.

Любые идеи о том, как это можно сделать?

ответ

2

Единственный способ, с помощью которого я вижу, что это работает из файла конфигурации, - создать класс MyService, который реализует IMyService, и за кулисами создает собственный канал (используя фрагмент кода ChannelFactory) и по существу выступает в качестве прокси-сервера.

Но вместо этого, почему бы просто не назвать

RegisterInstance<IMyService>(myServiceChannelInstance) 

на контейнере единства и передать в уже созданный экземпляр MyService канала?

+0

+1 То, что вы только что описали, является абстрактной фабрикой - это одно из стандартных решений для общих задач DI. –

+0

@Bryan: Спасибо, я понял, что могу использовать экземпляр, чтобы сделать это во время выполнения, но я пытался придерживаться web.config для всего. То, что я думаю, что я собираюсь закончить, состоит в том, что пользовательский фрагмент в моем web.config сопоставляет конечную точку службы с интерфейсом, а затем перебирает их во время выполнения. Таким образом, он не должен быть встроен в мое приложение. Теперь я оставлю это открытым, чтобы узнать, есть ли у кого-то альтернативы для этого с родными разделами конфигурации Unity. – Jay

1

В прошлом году я написал набор расширений Unity, которые достигают именно этого. Вы можете скачать мой инструментарий от http://neovolve.codeplex.com/releases/view/19004, у которого есть эта поддержка.

Посмотрите файл chm для инструментария. В документации для Neovolve.Toolkit.Unity.ProxyParameterValueElement будет описано, как добиться того, чего вы хотите с помощью этого инструментария.