C# 具有WCF服务的Ninject-未激发Dispose()

C# 具有WCF服务的Ninject-未激发Dispose(),c#,wcf,dependency-injection,inversion-of-control,ninject,C#,Wcf,Dependency Injection,Inversion Of Control,Ninject,我有一个WCF服务,它有一些较低级别的服务作为构造函数参数,它们是通过Ninject注入的,其中有一个db上下文。所有构造函数参数都可以IDisposable。该服务如下所示: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMo

我有一个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 => HttpContext.Current);
                ...
            }
                private static void RegisterServices(IKernel kernel)
                {
                    kernel.Bind<IDomainService>().To<DomainService>().InRequestScope();
                    ...
                }
我希望在每次方法调用完成后处理这些实例,我已尝试按如下方式设置绑定:

        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IDomainService>().To<DomainService>().InScope(x => OperationContext.Current);
            ...
        }
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To().InScope(x=>OperationContext.Current);
...
}
也像这样:

    [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 => HttpContext.Current);
                ...
            }
                private static void RegisterServices(IKernel kernel)
                {
                    kernel.Bind<IDomainService>().To<DomainService>().InRequestScope();
                    ...
                }
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To().InScope(x=>HttpContext.Current);
...
}
就像这样:

    [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 => HttpContext.Current);
                ...
            }
                private static void RegisterServices(IKernel kernel)
                {
                    kernel.Bind<IDomainService>().To<DomainService>().InRequestScope();
                    ...
                }
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To().InRequestScope();
...
}
尽管如此,在成功呼叫服务后,没有任何选项可以真正处理我的物品,欢迎提出任何想法,提前谢谢。

AFAIR
.InScope()
HttpContext.Current
OperationContext.Current
)这两种方法都有效,但不是您所期望的。Ninject将保留对scope对象的
WeakReference
,并定期检查是否收集了该对象。如果已收集该对象,它将在其作用域中处置该对象。如果没有内存压力,这可能需要很长时间


InRequestScope()应该可以工作。但是请注意,您还需要确保您已经安装了的最新版本,因为安装了。

Ninject.Extensions.Wcf,已将Ninject.Web.Common-3.2.0更新为最新版本,但仍然没有任何其他想法?哦,是的,您需要绑定类,而不是接口
.InRequestScope()
。看看这个问题:。请反馈这是否是您的问题。如果是这样,我们可以将其标记为副本。这有助于提高网站的质量(不同的人通过提出不同的问题来搜索相同的答案,这完全没问题b/c这样其他人通过谷歌有更好的机会找到它。只是应该有一个单一的解决方案/答案线程)只是试图将我的绑定更改为kernel.Bind().to().InRequestScope();-未更改,不调用Dispose()。您可以添加一个
.OnActivation()
,并在其中设置一个断点/写入控制台或其他东西,以便验证是否确实使用了此绑定?更改为kernel.Bind().to().InRequestScope().OnActivation(x=>Debug.WriteLine(“域服务”);输出窗口显示:域服务