当使用NInject与WCF服务使用MSMQ绑定在WAS中托管

问题描述:

我有一个使用MSMQ绑定的单向WCF服务,它使用IIS 7.0中的Windows激活服务激活。当使用NInject与WCF服务使用MSMQ绑定在WAS中托管

我是NInject的忠实粉丝,所以我一直在使用WCF的NInject扩展,这对于典型的HTTP WCF服务来说效果很好。

但是,在WAS激活服务中没有HTTP管道,所以在绑定我的类型时我无法使用InRequestScope,因为System.Web.HttpContext.Current为null。当我使用WAS时,我正在努力寻找替代方案,它会给我想要的东西。 AspCompatibility模式属性在此模式下也不起作用。

我想InThreadScope可能会奏效,但比它在执行一个单独的线程创建的服务。

所以基本上我需要的HttpContext为WCF相当于+是范围我的对象在请求级别。在这个世界上是否有一些静态对象会以相同的方式工作,或者有其他人对我可以共同攻击的东西有什么想法?

什么我实现我自己的WCF扩展Ninject 2.0之前,我知道有一个this了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在WAS服务,所以不知道你是否使用上面定义的WcfWebContextWcfContext,但你可以试试看看。如果WebOperationContext有效,那么你就全部设置好了。否则,我发现事情有点复杂。您会注意到上面的代码片段使用NinjectInstanceContext类,该类附加到OperationContext。这是我写的一个类,它使用Ninject 2.0的“缓存和收集”机制,允许对象进行确定性处置。基本上,这个类实现了IExtension<InstanceContext>这是一个WCF结构,用于将几乎所有东西都附加到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 { 
    } 

我的WCF扩展Ninject的其余部分是一样的one GitHub上。基本上发生的是创建一个插入WCF“激活”链的实例提供程序 - 我没有使用它们的特定术语,而是我如何理解事情。所以,这个想法是你的实例提供者应该提供被请求的WCF服务类的实例。所以,这里是我们使用Ninject生成服务实例的地方。通过这样做,我们也可以激活并注入任何依赖项。实例提供程序在我的实现中执行的操作是在实例中包装Ninject内核,如果NinjectInstanceContext已附加到OperationContext。然后将该服务的创建委托给此WCF扩展。当实例提供者被告知释放一个服务时,被附加到OperationContext的NinjectInstanceContext被处置,通过实现INotifyWhenDisposed的方式导致服务(以及潜在的依赖)的确定性处置。

希望这个讨论会有所帮助。如果您有兴趣,我会看看是否可以在这里发布更具体的代码。

+1

断开的链接。它是否正确? https://github.com/ninject/ninject.extensions.wcf – 2011-10-02 22:52:32

+0

你是对的 - 我纠正了链接。 – 2011-10-03 00:54:59

我敢肯定OperationContext是你要找的