带有WCF服务的Ninject - Dispose()未被触发

时间:2014-12-17 23:42:56

标签: c# wcf dependency-injection inversion-of-control ninject

我有一个WCF服务,它有一些较低级别的服务作为构造函数参数,它们通过Ninject注入并在其中有一个db上下文。所有构造函数参数都是IDisposable。该服务如下所示:

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

在成功致电服务后,仍然没有任何选项真正处理我的项目,欢迎任何想法,谢谢你提前。

1 个答案:

答案 0 :(得分:1)

AFAIR .InScope()HttpContext.CurrentOperationContext.Current)都有效 - 但不是您的期望。 Ninject将为范围对象保留WeakReference并定期检查它是否已收集。如果它被收集,它将把对象放在它的范围内。如果没有记忆压力,这可能需要很长时间。

如果您安装了Ninject.Extensions.Wcf

InRequestScope();应该可以正常工作。但请注意,您还需要确保获得Ninject.Web.Common - 3.2.3的最新版本,因为有issue with a previous version where .InRequestScope() didn't work