当使用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服务,所以不知道你是否使用上面定义的WcfWebContext
或WcfContext
,但你可以试试看看。如果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
的方式导致服务(以及潜在的依赖)的确定性处置。
希望这个讨论会有所帮助。如果您有兴趣,我会看看是否可以在这里发布更具体的代码。
我敢肯定OperationContext
是你要找的
断开的链接。它是否正确? https://github.com/ninject/ninject.extensions.wcf – 2011-10-02 22:52:32
你是对的 - 我纠正了链接。 – 2011-10-03 00:54:59