我有一个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();
...
}
在成功致电服务后,仍然没有任何选项真正处理我的项目,欢迎任何想法,谢谢你提前。
答案 0 :(得分:1)
AFAIR .InScope()
(HttpContext.Current
或OperationContext.Current
)都有效 - 但不是您的期望。 Ninject将为范围对象保留WeakReference
并定期检查它是否已收集。如果它被收集,它将把对象放在它的范围内。如果没有记忆压力,这可能需要很长时间。
InRequestScope();
应该可以正常工作。但请注意,您还需要确保获得Ninject.Web.Common - 3.2.3的最新版本,因为有issue with a previous version where .InRequestScope()
didn't work。