autofac/Autofac.Multitenant

Invalid interaction between DisposeAsync and Dispose in MultitenantContainer

me-viper opened this issue · 1 comments

  • Assembly version information for all project dependencies (packages.config, project.json)
    Current develop branch, commit ed664b9

  • The stack trace and message of any exception(s) encountered.

System.ObjectDisposedException : Cannot access a disposed object.
   at System.Threading.ReaderWriterLockSlim.TryEnterWriteLockCore(TimeoutTracker timeout)
   at System.Threading.ReaderWriterLockSlim.EnterWriteLock()
   at Autofac.Multitenant.MultitenantContainer.Dispose(Boolean disposing)
   at Autofac.Util.Disposable.DisposeAsync(Boolean disposing)
   at Autofac.Multitenant.MultitenantContainer.<>n__0(Boolean disposing)
   at Autofac.Multitenant.MultitenantContainer.DisposeAsync(Boolean disposing) 
  • If possible, a reproduction of the issue (ideally in a unit test form).
        [Fact]
        public async Task DisposeTest()
        {
            var strategy = new StubTenantIdentificationStrategy()
            {
                TenantId = "tenant1",
            };
            var mtc = new MultitenantContainer(strategy, new ContainerBuilder().Build());
            mtc.ConfigureTenant("tenant1", b => b.RegisterType<StubDependency1Impl1>().As<IStubDependency1>());

            await mtc.DisposeAsync();
        }

MultitenantContainer.AsyncDispose implementation does await base.DisposeAsync(disposing); call at the end. Disposable.DisposeAsync calls virtual Dispose() which causes call into MultitenantContainer.Dispose(). At the end code tries to access _readWriteLock that have been disposed already.

Fixed by #20