使用 WCF 服务注入 - Dispose() 未触发
本文关键字:Dispose WCF 服务 注入 使用 | 更新日期: 2023-09-27 18:34:28
我有一个WCF服务,它有一些较低级别的服务作为构造函数参数,它们通过Ninject注入并在其中具有数据库上下文。所有构造函数参数都是可识别的。该服务如下所示:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DirectoryService : IDirectoryService
{
private IDomainService DomainService { get; set; }
public DirectoryService(IDomainService domainService)
{
DomainService = domainService;
}
...
}
我想在每个方法调用完成后释放这些实例,我尝试按如下方式设置绑定:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IDomainService>().To<DomainService>().InScope(x => OperationContext.Current);
...
}
也像这样:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IDomainService>().To<DomainService>().InScope(x => HttpContext.Current);
...
}
像这样:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IDomainService>().To<DomainService>().InRequestScope();
...
}
成功调用服务后,仍然没有一个选项真正处理我的物品,欢迎任何想法,提前感谢您。
AFAIR .InScope()
(HttpContext.Current
或OperationContext.Current
(都可以工作 - 但不是你所期望的。Ninject 将保留对范围对象的WeakReference
,并定期检查它是否已被收集。如果已收集,它将在其范围内释放对象。如果没有内存压力,这可能需要很长时间。
如果你安装了Ninject.Extensions.Wcf,InRequestScope();
应该可以工作。但请注意,您还需要确保拥有最新版本的Ninject.Web.Common - 3.2.3,因为以前的版本存在.InRequestScope()
不起作用的问题。