2010-01-12 2 views
11

을 바인딩을 사용하고 있었다. 대체 내가 IIS 7.0에서 Windows 정품 인증 서비스를 사용하여 활성화되는 바인딩 MSMQ를 사용하여 한 가지 방법은 WCF 서비스가 MSMQ가

나는 그래서 일반적인 HTTP의 WCF 서비스를 위해 큰 일을 할 WCF에 대한 Ninject에 확장을 사용하고 Ninject에에 큰 팬입니다.

그러나 서비스를 활성화 할 때 HTTP 파이프 라인이 없으므로 System.Web.HttpContext.Current가 null이므로 InRequestScope를 사용하여 내 유형을 바인딩 할 수 없습니다. 나는 내가 원하는 것을 줄 수있는 WAS를 사용할 때 대안을 찾기 위해 고심하고있다. AspCompatibility 모드 특성은이 모드에서도 작동하지 않습니다.

는 나는 나의 객체를 InThreadScope 작동 거라고 생각하지만, 서비스가 실행되는 것보다 별도의 스레드에서 생성됩니다.

을 그래서 기본적으로 내가 WCF에 대한 HttpContext를 동등한 필요 + 범위에 WAS 요청 수준. 이 세상에 똑같은 방식으로 작동하는 정적 객체가 있습니까? 아니면 다른 사람들이 내가 해킹 할 수있는 것에 대한 아이디어가 있습니까?

답변

9

찾고있는 확신합니다. 내 구현은 약간 다릅니다,하지만 범위 지정 객체에 대한 해결책을 마련 않았다 다음은 WCF 호스팅하지 않은

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

: 완성도를 들어

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; 
    } 
} 

, 이것은 내가 위에서 정의 된 콜백을 사용하는 방법입니다 WAS의 서비스이므로 위에서 정의한 WcfWebContext 또는 WcfContext을 사용할 지 확실하지 않지만 사용해 볼 수는 있습니다. WebOperationContext이 작동하면 모두 설정됩니다. 그렇지 않으면, 나는 물건이 조금 더 복잡하다는 것을 알았다. 위의 코드 스 니펫은 OperationContext에 연결된 NinjectInstanceContext 클래스를 사용합니다. 이 클래스는 Ninject 2.0의 "캐시 및 수집"메커니즘을 사용하여 객체를 결정적으로 처리 할 수있는 클래스입니다. 기본적으로, 클래스는 WCF가 OperationContext 거의 아무것도 부착 구성이다 구현 IExtension<InstanceContext>이다. 이 클래스는 또한 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 { 
    } 

Ninject에 대한 내 WCF 확장의 나머지는 GitHub의에 one과 동일 : 다음과 같은 클래스 정의는 모습입니다. 기본적으로 어떤 일이 일어나는가하는 것은 인스턴스 공급자가 WCF "활성화"체인에 연결되어 생성된다는 것입니다. 특정 용어를 사용하지 않고 사물을 어떻게 이해하는지 알 수 있습니다. 따라서 인스턴스 공급자는 요청되는 WCF 서비스 클래스의 인스턴스를 제공해야합니다. 그래서 여기에 Ninject를 사용하여 서비스 인스턴스를 생성합니다. 그렇게함으로써 우리는 어떤 의존성도 활성화하고 주입 할 수 있습니다. 어떤 인스턴스 공급자가 내 구현하는 일은 NinjectInstanceContext 경우 인스턴스에 Ninject에 커널을 마무리하고 OperationContext에 첨부합니다. 그런 다음 서비스 생성이이 WCF 확장에 위임됩니다. 인스턴스가 제공하는 서비스를 해제하라고하면 OperationContext 부착 된 NinjectInstanceContext는 구현의 방법으로 INotifyWhenDisposed 결정적 서비스의 처리 (잠재적 종속성)을 일으키는 배치된다. 이 논의 도움이

희망.관심 있다면 여기에 게시 된 좀 더 구체적인 코드를 얻을 수 있는지 알아 보겠습니다.

+1

깨진 링크. 이 올바른지? https://github.com/ninject/ninject.extensions.wcf –

+0

맞습니다. 링크를 수정했습니다. –

0

은 내가 OperationContext 내가 GitHub의에 거기 this까지 알고 있었다 전에 내가 Ninject에 2.0 내 자신의 WCF 확장을 구현 당신이

관련 문제