public void ActivatorScope_should_release_and_dispose_scoped_job_when_disposed() { var container = new WindsorContainer(); IDisposableJob job = null; container.Register( Component.For <IDisposableJob>() .UsingFactoryMethod(A.Fake <IDisposableJob>) .OnDestroy(x => { job = x; }) .LifestyleScoped() ); // For details about how this works see: // https://github.com/HangfireIO/Hangfire/blob/129707d66fde24dc6379fb9d6b15fa0b8ca48605/src/Hangfire.Core/Server/CoreBackgroundJobPerformer.cs#L47 var activator = new WindsorJobActivator(container.Kernel); // Start a new job scope using (var scope = activator.BeginScope(null)) { // Resolve the new job var resolvedJob = scope.Resolve(typeof(IDisposableJob)) as IDisposableJob; Assert.IsNotNull(resolvedJob); } Assert.IsNotNull(job, "job was not released by container"); A.CallTo(() => job.Dispose()).MustHaveHappened(); }
public void ActivatorScope_should_release_and_dispose_job_when_disposed() { var container = new WindsorContainer(); IDisposableJob job = null; container.Register( Component.For <IDisposableJob>() .UsingFactoryMethod(A.Fake <IDisposableJob>) .OnDestroy(x => { job = x; }) .LifeStyle.Transient ); // For details about how this works see: // https://github.com/HangfireIO/Hangfire/blob/129707d66fde24dc6379fb9d6b15fa0b8ca48605/src/Hangfire.Core/Server/CoreBackgroundJobPerformer.cs#L47 var activator = new WindsorJobActivator(container.Kernel); // Start a new job scope using (var scope = activator.BeginScope(null)) { // Resolve the new job var resolvedJob = scope.Resolve(typeof(IDisposableJob)) as IDisposableJob; // As long as we're in the scope, windsor should track the component Assert.IsTrue(container.Kernel.ReleasePolicy.HasTrack(resolvedJob)); } // When we leave the scope windsor should stop tracking the resolved job Assert.IsFalse(container.Kernel.ReleasePolicy.HasTrack(job)); A.CallTo(() => job.Dispose()).MustHaveHappened(); }