Ninject с дуплексным каналом WCF - PullRequest
2 голосов
/ 27 июня 2011

Я использую ninject с wcf для ввода параметров в классы обслуживания.Теперь мне нужно сделать это для дуплексной службы, и я не уверен, что делать дальше.

В данный момент мой клиент вызывает дуплексную службу, используя DuplexChannelFactory, например:

    InstanceContext instanceContext = new InstanceContext(new TheCallback());
    var factory = new DuplexChannelFactory<IScannerManager>(instanceContext, "ScannerManagerEndPoint");
    var channel = factory.CreateChannel();

IClientCallBack является частью моего контракта на дуплексную связь:

[ServiceContract(CallbackContract = typeof(IClientCallBack))]
public interface IScannerManager
{
    [OperationContract]
    void Register(string token);

}

public interface IClientCallBack
{
    [OperationContract(IsOneWay = true)]
    void SendClientMessage(ScannerMessageWrapper message);
}

Я изменил свой служебный ctor, добавив новый параметр, который я хочу ввести следующим образом:

    public ScannerManagerService(Func<IClientCallBack> callBack, IRepositoryFactory repositoryFactory)
    { .. }

Где IRepositoryFactory - это то, что я сейчас хочу внедрить.Я подключил свой IRepositoryFactory к моим привязкам Ninject, но когда я тестирую код, я вижу:

System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail] : Error activating IntPtr
No matching bindings are available, and the type is not self-bindable.
Activation path:
  3) Injection of dependency IntPtr into parameter method of constructor of type Func{IClientCallBack}
  2) Injection of dependency Func{IClientCallBack} into parameter callBack of constructor of type ScannerManagerService
  1) Request for ScannerManagerService

Итак, Nineject говорит, что не может видеть привязку для обратного вызова ... Я не могупросто определите привязку для обратного вызова, который я предполагаю - возможно ли это с помощью ninject?

Примечание. Этот вопрос аналогичен Dependency Inject с Ninject 2.0 , но я спрашиваю его еще раз, потому чтотам нет принятых ответов.В этом посте предлагается ввести фабрику, но я не уверен, как это будет выглядеть, и если это будет означать, что вам не нужно использовать DuplexChannelFactory.

Спасибо.

1 Ответ

0 голосов
/ 27 июня 2011

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

Bind<Func<IClientCallback>>.To...

или

public interface IClientCallbackFactory { IClientCallback GetCallback(); }
...
Bind<IClientCallbackFactory.To...

Дело в том, что яне знаю, с чем бы вы связали это, потому что я не знаю, какую роль он играет в вашем приложении.

Обновление

Я сделал , немного читая о DuplexСлужбы , и я думаю, что это может быть то, что вы ищете:

Bind<Func<IClientCallback>>().ToMethod(
    c => () => OperationContext.Current.GetCallbackChannel<IClientCallback>());

Как я упоминал ранее, вы также можете создать интерфейс фабрики, который реализуется с использованием того же метода.

...