Внедрение зависимостей с помощью Ninject 2.0 - PullRequest
1 голос
/ 07 сентября 2010

Небольшой вопрос относительно Ninject.

Я использую дуплексный канал 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 Ответ

1 голос
/ 10 сентября 2010

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

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

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

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

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

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

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

Его нельзя вводить в пост, так что, надеюсь, кто-то скоро будет с хорошим классом-оберткой такого рода.

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

...