WCF& Ninject - 将Ninject内核导入IDispatchMessageInspector实例

时间:2013-12-19 17:24:14

标签: wcf ninject

我目前已将Ninject绑定到WCF应用程序(使用ninject.extensions.wcf),基本功能正常。但是,我添加了自定义IDispatchMessageInspectorIServiceBehavior以验证每个服务调用(通过检查数据库中的某些凭据),但我不完全确定如何让Ninject在IDispatchMessageInspector。

我到目前为止的代码是:

public class MyServiceInspector: IDispatchMessageInspector
{
    #region Methods

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        // TODO: Get credentials from request here, and hit database.

        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        // Do nothing
    } 

   #endregion
}

启动此操作的IServiceBehavior如下:

public class MyServiceBehaviour : Attribute, IServiceBehavior
{
    #region Methods

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
        // Do nothing
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        // Loop through channels and endpoints
        foreach (ChannelDispatcher cDispatcher in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher eDispatcher in cDispatcher.Endpoints)
            {
                // Add credentials inspector
                eDispatcher.DispatchRuntime.MessageInspectors.Add(new MyServiceInspector());
            }
        }
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        // Do nothing
    }

    #endregion
}

我在互联网上寻找例子,但我似乎找不到任何东西。这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

我知道这个答案很晚,但希望它可以帮助其他人遇到这个问题。

我今天遇到了同样的问题..我需要一个带有注入依赖项的消息检查器。他们从版本3.2向Ninjext.Extensions.WCF添加了一个NinjectBehaviorExtensionElement类。所以这就是我在Message Inspector中注入依赖项的方法:

消息检查器:

 public class MyMessageInspector : IDispatchMessageInspector
 {
    public MyMessageInspector(IInjectedDependency injectedDependency)
    {

    }

    public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
    {
    }

    public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
    }
 }

行为:

public class MyMessageInspectionBehavior : IEndpointBehavior
{
    private readonly IDispatchMessageInspector _messageInspector;

    public MyMessageInspectionBehavior(IDispatchMessageInspector messageInspector)
    {
        _messageInspector = messageInspector;
    }

    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(_messageInspector);
    }

    public void Validate(ServiceEndpoint endpoint)
    {
    }

}

Ninject Binding:

this.Bind<IDispatchMessageInspector>()
    .To<MyMessageInspector>()
    .WhenInjectedInto<IEndpointBehavior>();

最后一步是配置:

<system.serviceModel>
<extensions>
  <behaviorExtensions>
    <add name="MyCustomMessageInspector" 
         type="Ninject.Extensions.Wcf.BaseNinjectBehaviorExtensionElement+NinjectBehaviorExtensionElement`1[[MyNamespace.MyMessageInspectionBehavior, MyAssemblyName]], Ninject.Extensions.Wcf" />
  </behaviorExtensions>
</extensions>
<behaviors>
  <endpointBehaviors>
    <behavior>
      <MyCustomMessageInspector />
    </behavior>
  </endpointBehaviors>

答案 1 :(得分:0)

我暂时停放了这个,因为似乎没有任何解决方案。我只是直接连接到我的上下文,以期在将来改进它。