【问题标题】:Ninject with WCF Duplex channelNinject 与 WCF 双工通道
【发布时间】:2011-06-27 15:29:48
【问题描述】:

我正在使用 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 是我现在要注入的地方。我已经在我的 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。

谢谢。

【问题讨论】:

    标签: c# wcf ninject duplex


    【解决方案1】:

    我没有在网上找到有关 IClientCallback 课程的任何信息,所以我假设这是您的产品特有的内容?您当然可以创建到 Func&lt;IClientCallback&gt; 的绑定,或者您可以定义一个特定的工厂接口并绑定到它。

    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>());
    

    正如我之前提到的,您同样可以创建使用相同方法实现的工厂接口。

    【讨论】:

    • 谢谢。我已经更新了原版。发布有关 ClientBack 的信息。问题是 DuplexChannelFactory 负责返回此信息,以便客户端有一个回调,服务器可以使用该回调来实现双工通信。我不知道我会将它绑定到什么...我认为添加另一层抽象可能会更容易,这样服务就可以传递到另一个类 - 我可以轻松测试它而不必担心注入参数进入我的 wcf 双工服务。
    • @Matt Roberts:现在对我来说更有意义了。看看我的更新是否有效。
    • 啊,是的,这似乎可行 :) 我不得不稍微调整一下您的绑定: Bind>().ToMethod(Meth); .. private static Func Meth(IContext arg) { return () => OperationContext.Current.GetCallbackChannel(); }
    • @Matt Roberts:啊,当然,这是有道理的。你可能也刚刚完成.ToMethod(c =&gt; () =&gt; OperationContext.....)
    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2011-03-23
    相关资源
    最近更新 更多