2014-01-15 47 views
0

我正在使用WCF服务使用双工通道允许服务回调客户端以中继服务层中的组件引发的事件。代理类的定义和构建这样的:Ninject:绑定ServiceHost实例以用于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配置 **

回答

1

发现我可以这样配置它供给的EvsMembershipProxy构造器参数。

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

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