2013-12-19 3 views
1

현재 Ninject를 WCF 응용 프로그램에 설치했습니다 (ninject.extensions.wcf 사용). 기본 사항이 올바르게 작동합니다. 그러나 각 서비스 호출 (일부 자격 증명에 대해 데이터베이스 검사)을 인증하기 위해 IDispatchMessageInspectorIServiceBehavior 사용자 지정을 추가했지만 IDispatchMessageInspector 내에서 Ninject를 처리하는 방법을 완전히 모르겠습니다.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 클래스를 추가했습니다.

메시지 경위 : 그래서 여기에 내가 내 메시지 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에 바인딩 :

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

아무 해결책도없는 것 같아서 지금은 주차했습니다. 나는 미래에 그것을 개선하기위한 관점에서 직접적으로 나의 맥락에 연결하고있다.