2010-09-07 7 views
1

Немного вопрос относительно Ninject.Inject in Dependency с Ninject 2.0

Я использую двусторонний канал WCF для связи с услугой. Канал определяется как интерфейс, позволяет называть его IMyChannel для простоты. Для создания канала мы используем метод DuplexChannelFactory<IMyChannel> объекта CreateChannel(). До сих пор мне удалось связать заводский класс с этим.

Bind< DuplexChannelFactory< IMyChannel>>().ToMethod(context => 
    new DuplexChannelFactory< IMyChannel>(
     new MessageEndPoint(), 
     new NetTcpBinding(), 
     "net.tcp://localhost:8321")).InSingletonScope(); 
    } 
} 

Однако я немного не знаете, как связать интерфейс IMyChannel, поскольку я использую Ninject создать DuplexChannelFactory<IMyChannel> так, чтобы связать IMyChannel я Bind< IMyChannel>(). ???

ответ

1

Это не проблема контейнера IOC.

Хотя, в теории, вы можете сделать:

Bind<Func<IMyInterface>>().ToConstant(context => context.Kernel.Get<DCF<IMC>>().CreateChannel) 

, а затем требовать Func<IMyInterface>() в вашем CTOR, назвав его всякий раз, когда вы хотите создать канал.

Проблема заключается в том, что объект, который возвращает CreateChannel(), реализует как IMyChannel, так и IDisposable, поэтому вы не можете аккуратно использовать используемый блок, если это то, что вы собираетесь вернуть. Это то, что инструмент генерирует для вас при создании Service Reference, а WCF OOTB не предлагает общий механизм здесь.

Я лично впрыснуть фабрику, и у него есть Create<T>() метод, который дает объект-оболочку, что:

  • реализует IDisposable
  • есть способ вызова методов по всему каналу.

Это не инъекция в сообщение, так что, надеюсь, кто-то скоро будет с таким классным классом обертки.

Не уверен, что Синглтон подходит, но я должен осмотреться, чтобы быть уверенным.

+0

Спасибо за ваш ответ Рубин. Sry для моего позднего ответа, но я был отстранен от какого-то другого проекта внезапно. Но теперь в ответ на эту проблему и дадим ваше предложение попробовать и отчитаться. – Goodiepal

+0

+1 для предлагая фабрику в этом случае. – Arafangion