2010-09-21 2 views
2

Я пытаюсь использовать единство, чтобы разрешить общий экземпляр IChannelFactory<ISomeType>, чтобы создать каналы для службы, которую я написал.единицу конфигурации открытых общих типов

Проблема заключается в том, что конкретная версия этого класса ChannelFactory<ISomeType> принимает конкретный тип System.ServiceModel.Channels.Binding в качестве параметра.

Моя первая проблема заключалась в том, что он не смог найти System.ServiceModel, но я решил, что, поставив супер полное имя (включая номер версии и т. Д.). Так что теперь я могу взломать код, но он взрывается, когда я пытаюсь разрешить IChannelFactory

Мой конфиг как таковой:

 <!--binding--> 
     <type name="customerBinding" type="System.ServiceModel.BasicHttpBinding, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 
     <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration"> 
      <constructor> 
      <param name="configurationName" parameterType="System.String"> 
       <value value="CustomerAccountService" /> 
      </param>     
      </constructor> 
     </typeConfig> 
     </type> 

     <!-- customer account channel factory --> 
     <type name="customerChannelFactory" 
      type="System.ServiceModel.Channels.IChannelFactory`1[[ServiceContracts.Customer.ICustomerAccountProvider, ServiceContracts.Customer]], System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" 
      mapTo="System.ServiceModel.ChannelFactory`1[[ServiceContracts.Customer.ICustomerAccountProvider, ServiceContracts.Customer]], System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 
     <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration"> 
      <constructor> 
      <param name="binding" parameterType="System.ServiceModel.Channels.Binding, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 
       <dependency name="customerBinding" /> 
      </param> 
      </constructor> 
     </typeConfig> 
     </type>   

ошибка я получаю, что он не может построить тип, потому что это интерфейс, хотя отображение на конкретный тип явно существует. Обратите внимание, что я пытаюсь сжать разрешение типа к определенным типам, поэтому он работает только с IChannelFactory<ISomeType>, а не IChannelFactory<ISomeOtherType>, например. возможно, это не правильный способ сделать что-то?

Если я просто пытаюсь решить Binding в изоляции он говорит, что не может неоднозначность от других конструкторов, принимающих один параметр (даже если я определил тип парам быть строка!)

Любые идеи или указатели, что я делаю неправильно здесь заглядывает? Или, возможно, даже решение ;-)

Благодаря

+0

Рад видеть, что я не единственный, кто не может понять, что продолжая всякий раз, когда я пытаюсь что-то, что нетривиально с Unity! – fearofawhackplanet

+0

haha ​​Я просто читал ваш вопрос о единстве и дженериках две секунды назад! Хорошая ссылка со стороны врага, кстати :-) – WickyNilliams

+0

Вы решаете с именем регистрации? –

ответ

0

после долгих поисков, кажется, это может быть невозможно в единстве 1.2? кажется, что единство 1.2 не поддерживает открытые общие типы, эта функция была введена в единстве 2.0.

увидеть следующее: http://davidhayden.com/blog/dave/archive/2008/03/25/UnityDependencyInjectionOpenGenericTypes.aspx

если кто-нибудь хотел бы доказать обратное, я бы приветствовать :-)

+0

Вы заметили дату в этом блоге? Это 2008! Это говорит о новой капли, добавляющей эту особенность в Unity 1.2 –

+0

chris, к сожалению, мы застряли с использованием 1.1, так что здесь уместно.И нет простого способа, которым я могу быстро перейти на более новую версию :-( – WickyNilliams

0

Вы можете настроить общий интерфейс/реализация следующим образом:

<type name="customerChannelFactory" 
      type="System.ServiceModel.Channels.IChannelFactory`1, System.ServiceModel" 
      mapTo="System.ServiceModel.ChannelFactory`1, System.ServiceModel"> 
     <typeConfig> 
      <constructor> 
      <param name="binding" parameterType="System.ServiceModel.Channels.Binding, System.ServiceModel"> 
       <dependency name="customerBinding" /> 
      </param> 
      </constructor> 
     </typeConfig> 
     </type> 

более подробную информацию о msdn - Configuration Support for Generics

+0

Как бы я ограничил это для ICustomerAccountProvider? потому что я в конечном итоге намерен иметь несколько канальных фабрик для разных типов с разными привязками, поэтому я не уверен, что это будет работать в долгосрочной перспективе? – WickyNilliams

+0

Эта работа выполняется только в том случае, если ChannelFactory является общей реализацией IChannelFactory. Если у вас несколько (не общих) фабрик каналов, вы должны сопоставить их с конкретной реализацией: ' onof

+0

, это предназначено для работы с общим «ChannelFactory ». Я пробовал ваше предложение безрезультатно – WickyNilliams

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