作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 MSMQ 绑定(bind)的单向 WCF 服务,该服务是使用 IIS 7.0 中的 Windows 激活服务激活的。
我是 NInject 的忠实粉丝,所以我一直在使用 WCF 的 NInject 扩展,对于典型的 HTTP WCF 服务来说,它会很好用。
但是,在 WAS 激活服务中没有 HTTP 管道,因此在绑定(bind)我的类型时我不能使用 InRequestScope,因为 System.Web.HttpContext.Current 为空。在使用 WAS 时,我正在努力寻找能够满足我想要的替代方案。 AspCompatibility 模式属性在此模式下也不起作用。
我认为 InThreadScope 可能会工作,但该服务是在一个单独的线程中创建的,而不是它在其中执行的线程。
所以基本上我需要 WCF+WAS 的 HttpContext 等价物来在请求级别限定我的对象。这个世界上是否有一些静态对象可以以相同的方式工作,或者其他人对我可以一起破解的东西有任何想法吗?
最佳答案
在我知道有 this 之前,我为 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);
WcfWebContext
或
WcfContext
上面定义的,但你可以试试看。如果
WebOperationContext
工作,那么你就准备好了。否则,我发现事情有点复杂。您会注意到上面的代码片段使用了
NinjectInstanceContext
附加到
OperationContext
的类.这是我编写的一个类,它使用 Ninject 2.0 的“缓存和收集”机制,允许确定性地处置对象。基本上,该类是实现
IExtension<InstanceContext>
这是一个 WCF 构造,用于将几乎任何东西附加到
OperationContext
.这个类也实现了 Ninject 的
INotifyWhenDisposed
接口(interface),它为确定性处理提供支持。这是类定义的样子:
/// <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 {
}
NinjectInstanceContext
,实例提供程序在我的实现中所做的是将Ninject 内核包装在一个实例中。并将其附加到
OperationContext
.然后将服务的创建委托(delegate)给此 WCF 扩展。当实例提供者被告知释放服务时,
NinjectInstanceContext
通过实现
INotifyWhenDisposed
处理附加到 OperationContext 的导致服务(以及可能的依赖项)的确定性处置。
关于wcf - 将 NInject 与 WCF 服务一起使用时使用 MSMQ 绑定(bind)在 WAS 中托管时替代 HttpContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2046704/
我是一名优秀的程序员,十分优秀!