호스팅 된 WCF 서비스와 함께 Ninject를 사용할 때 HTTPContext 대안 MSMQ 바인딩을 사용했습니다.

StackOverflow https://stackoverflow.com/questions/2046704

  •  20-09-2019
  •  | 
  •  

문제

IIS 7.0에서 Windows Activation Service를 사용하여 활성화되는 MSMQ 바인딩을 사용하여 WCF 서비스가 있습니다.

나는 Ninject의 큰 팬이므로 WCF의 Ninject Extension을 사용하고 있는데, 일반적인 HTTP WCF 서비스는 훌륭하게 작동합니다.

그러나 in은 활성화 서비스가 있었다. HTTP 파이프 라인이 없으므로 system.web.httpcontext.current가 null이기 때문에 내 유형을 바인딩 할 때 InrequestScope를 사용할 수 없습니다. 나는 사용했을 때 대안을 찾기 위해 고군분투하고 있습니다. 이 모드에서도 AspCompatibility 모드 속성이 작동하지 않습니다.

InthreadScope가 작동 할 수 있다고 생각했지만 서비스는 실행되는 것보다 별도의 스레드로 생성됩니다.

따라서 기본적으로 WCF+의 HTTPContext와 동등한 것은 요청 레벨에서 내 객체를 범위로 만드는 것이 필요합니다. 이 세상에는 같은 방식으로 작동하거나 다른 사람이 함께 해킹 할 수있는 아이디어가 있습니까?

도움이 되었습니까?

해결책

나는 Ninject 2.0에 대한 내 자신의 WCF 확장을 구현했습니다. 이것 Github에서. 내 구현은 약간 다르지만 범위를 범하는 개체에 대한 솔루션을 생각해 냈습니다.

using System;
using Ninject.Activation;

namespace Ninject.Contrib.Wcf {
  /// <summary>
  /// Defines Scope Callbacks for WCF Context.
  /// </summary>
  public class NinjectWcfScopeCallbacks {
    /// <summary>
    /// Defines WCF Context scope.
    /// </summary>
    public static readonly Func<IContext, object> WcfContext =
      ctx => (System.ServiceModel.OperationContext.Current != null
                ? System.ServiceModel.OperationContext.Current.
                    InstanceContext.
                    Extensions.Find<NinjectInstanceContext>()
                : null);

    /// <summary>
    /// Defines WCF Web Context scope.
    /// </summary>
    public static readonly Func<IContext, object> WcfWebContext = 
               ctx => System.ServiceModel.Web.WebOperationContext.Current;
  }
}

완전성을 위해 이것이 위에서 정의 된 콜백을 사용하는 방법입니다.

Bind<IHelloWorldService>()
        .To<HelloWorldService>()
        .InScope(NinjectWcfScopeCallbacks.WcfWebContext);

호스팅되지 않은 WCF 서비스는 WcfWebContext 또는 WcfContext 위에서 정의되었지만, 당신은 시도하고 볼 수 있습니다. 만약에 WebOperationContext 작동합니다. 그러면 당신은 모두 설정됩니다. 그렇지 않으면, 나는 상황이 조금 더 복잡하다는 것을 알았습니다. 위의 코드 스 니펫은 a를 사용합니다 NinjectInstanceContext 첨부 된 클래스 OperationContext. 이것은 린젝트 2.0의 "캐시 및 수집"메커니즘을 사용하여 객체를 결정적으로 배치 할 수있는 메커니즘을 사용하는 클래스입니다. 기본적으로 수업은 구현입니다 IExtension<InstanceContext> 거의 모든 것을 OperationContext. 이 클래스는 또한 Ninject의 구현입니다 INotifyWhenDisposed 결정 론적 처분을 지원하는 인터페이스. 클래스 정의의 모습은 다음과 같습니다.

  /// <summary>
  /// Defines a custom WCF InstanceContext extension that resolves service instances
  /// using Ninject.  
  /// <remarks>
  /// The custom InstanceContext extension provides support for deterministic disposal
  /// of injected dependencies and service instances themselves by being hook into 
  /// Ninject's "cache and collect" mechanism (new in Ninject 2.0) for object life cycle 
  /// management.  This allows binding object instances to the lifetime of a WCF context
  /// and having them deterministically deactivated and disposed.
  /// </remarks>
  /// </summary>
  public class NinjectInstanceContext : 
                IExtension<InstanceContext>, INotifyWhenDisposed {
  }

Nineject에 대한 내 WCF 확장의 나머지는 하나 Github에서. 기본적으로 발생하는 것은 WCF "활성화"체인에 연결된 인스턴스 제공 업체가 만들어 졌다는 것입니다. 저는 특정 용어를 사용하지 않으며, 내가 이해하는 방법입니다. 따라서 아이디어는 인스턴스 제공 업체가 요청중인 WCF 서비스 클래스의 인스턴스를 공급해야한다는 것입니다. 따라서 여기에 Ninject를 사용하여 서비스 인스턴스를 생성합니다. 그렇게함으로써 우리는 의존성을 활성화하고 주입 할 수도 있습니다. 인스턴스 제공 업체가 내 구현에서하는 일은 인스턴스에서 린저 커널을 마무리하는 것입니다. NinjectInstanceContext 그리고 그것을 첨부하십시오 OperationContext. 그런 다음 서비스 생성은이 WCF 확장으로 위임됩니다. 인스턴스 제공 업체가 서비스를 릴리스하라는 지시를 받으면 NinjectInstanceContext OperationContext에 첨부되어 구현을 통해 폐기됩니다. INotifyWhenDisposed 서비스의 결정 론적 처분을 유발합니다 (및 잠재적으로 의존성).

이 토론이 도움이되기를 바랍니다. 관심이 있으시면 여기에 더 구체적인 코드를 게시 할 수 있는지 살펴 보겠습니다.

다른 팁

확실해 OperationContext 당신이 찾고있는 것입니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top