使用 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();
                    ...
                }

成功调用服务后,仍然没有一个选项真正处理我的物品,欢迎任何想法,提前感谢您。

使用 WCF 服务注入 - Dispose() 未触发

AFAIR .InScope()(HttpContext.CurrentOperationContext.Current(都可以工作 - 但不是你所期望的。Ninject 将保留对范围对象的WeakReference,并定期检查它是否已被收集。如果已收集,它将在其范围内释放对象。如果没有内存压力,这可能需要很长时间。

如果你安装了Ninject.Extensions.Wcf,InRequestScope();应该可以工作。但请注意,您还需要确保拥有最新版本的Ninject.Web.Common - 3.2.3,因为以前的版本存在.InRequestScope()不起作用的问题。