2013-12-19 33 views
1

我目前已經將Ninject裝入WCF應用程序(使用ninject.extensions.wcf),基本工作正常。不過,我已經添加了自定義IDispatchMessageInspectorIServiceBehavior以驗證每個服務調用(通過檢查數據庫與某些憑據),但我不完全確定如何讓Ninject在IDispatchMessageInspector中工作。WCF&Ninject - 將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

我知道這個答案很晚,但希望它可以幫助其他人解決這個問題。

我今天有同樣的問題..我需要一個帶有注入依賴的消息檢查器。他們在3.2版本中向Ninjext.Extensions.WCF添加了一個NinjectBehaviorExtensionElement類。因此,這裏是我如何在我的消息檢查注入的依賴關係:

消息檢查:

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綁定:

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> 
+0

嗨,我知道這是年後的今天,但我不知道將在MyMessageInspector是單身或爲每個請求一個新的實例? –

0

我暫時停了這個,因爲似乎沒有任何解決方案。我只是直接與我的背景相聯繫,以期在將來改進它。