带有WCF双工通道的Ninject

时间:2011-06-27 15:29:48

标签: c# wcf ninject duplex

我正在使用带有wcf的ninject将参数注入服务类。我现在需要为双工服务这样做,我不确定如何继续。

目前,我的客户端使用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就是我现在想要注入的东西。我已经在我的ninject绑定中连接了我的IRepositoryFactory,但是当我测试代码时,我看到了:

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

所以ninject说它无法看到回调的绑定..我不能只为我假设的回调定义一个绑定 - 这可能与ninject有关吗?

注意:这个问题类似于Dependency Inject with Ninject 2.0,但我再次问它,因为那里没有可接受的答案。在那篇文章中建议注入一个工厂,但我不确定它会是什么样子,如果它意味着你不需要使用DuplexChannelFactory。

感谢。

1 个答案:

答案 0 :(得分:0)

我在网上找不到关于IClientCallback课程的任何内容,所以我认为这是您产品的特定内容?您当然可以创建与Func<IClientCallback>的绑定,或者您可以定义特定的工厂接口并将其绑定到该接口。

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

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

问题是,我不知道你绑定它是什么,因为我不知道它在你的应用程序中起什么作用。

更新

我做了a little reading up on Duplex Services,我想这可能就是你要找的东西:

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

正如我之前提到的,您也可以创建一个使用相同方法实现的工厂界面。