【问题标题】:Ninject: Bind ServiceHost instance for use with WCF duplex serviceNinject:绑定 ServiceHost 实例以与 WCF 双工服务一起使用
【发布时间】:2014-01-15 09:39:11
【问题描述】:

我正在开发一个 WCF 服务,该服务使用双工通道允许服务回调客户端以中继服务层中的组件引发的事件。代理类的定义和构造如下:

public class EvsMembershipProxy : DuplexClientBase<IMembershipProviderCallback>, IEvsMembershipProvider
{
    public EvsMembershipProxy(InstanceContext callbackInstance): base(callbackInstance)
    { 
    }
}

我需要在使用 ASP.NET 成员资格系统配置的类中获取此类的实例,因此我将其绑定如下:

_ninjectKernal.Bind<IEvsMembershipProvider>().To<EvsMembershipProxy>();

我像这样注入它:

public class EvsMembershipProvider : MembershipProvider, IMembershipProviderCallback
{
    #region "Dependencies"
    [Inject]
    public IEvsMembershipProvider MembershipProvider { get; set; }
    #endregion
}

配置的成员资格提供程序由 Ninject 注入,如下所示:

_ninjectKernal.Inject(System.Web.Security.Membership.Provider);
_ninjectKernal.Inject(System.Web.Security.Roles.Provider);

我已经在没有双工服务的情况下使用 WCF 服务层测试了注入模式,它可以正常工作。但是,当我包含双工服务时,Ninject 在绑定过程中失败并出现以下错误:

Error activating ServiceHostBase
No matching bindings are available, and the type is not self-bindable.
Activation path:
 4) Injection of dependency ServiceHostBase into parameter host of constructor of type InstanceContext
 3) Injection of dependency InstanceContext into parameter callbackInstance of constructor of type EvsMembershipProxy
 2) Injection of dependency IEvsMembershipProvider into property MembershipProvider of type EvsMembershipProvider
 1) Request for EvsMembershipProvider

Suggestions:
 1) Ensure that you have defined a binding for ServiceHostBase.
 2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
 3) Ensure you have not accidentally created more than one kernel.
 4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
 5) If you are using automatic module loading, ensure the search path and filters are correct.

所以看起来我需要为 EvsMembershipProxy 构造函数中使用的 ServiceHostBase 类绑定来解决此问题。但是,我不知道如何配置它。到目前为止,我解决 ServiceHostBase 绑定的最佳尝试是:

_ninjectKernal.Bind<ServiceHostBase>().ToMethod(c => OperationContext.Current.Host);

但是,在绑定期间这会失败并出现空引用异常。

如何绑定 ServiceHostBase 类型以使这种注入起作用?

** 编辑:简化原始代码以删除一些可以由 WCF 配置提供的 EvsMembershipProxy 构造函数参数 **

【问题讨论】:

    标签: asp.net-mvc wcf ninject duplex-channel


    【解决方案1】:

    发现我可以这样配置。

    _ninjectKernal.Bind<IEvsMembershipProvider>()
                  .To<EvsMembershipProxy()
                  .WithConstructorArgument("callbackInstance", Membership.Provider);
    

    配置的成员资格提供者实现IMembershipProviderCallback接口并接收来自服务的回调。

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多