From 5ed4ce3b1d17f06f551d3522b4d660260bf2f308 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 1 Feb 2019 12:32:04 -0800 Subject: [PATCH 1/3] Avoid clearing ResolvedServices --- .../DI/src/ServiceLookup/ServiceProviderEngineScope.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/DependencyInjection/DI/src/ServiceLookup/ServiceProviderEngineScope.cs b/src/DependencyInjection/DI/src/ServiceLookup/ServiceProviderEngineScope.cs index 4a65191d05c..52dd9d5e228 100644 --- a/src/DependencyInjection/DI/src/ServiceLookup/ServiceProviderEngineScope.cs +++ b/src/DependencyInjection/DI/src/ServiceLookup/ServiceProviderEngineScope.cs @@ -127,7 +127,9 @@ private List BeginDispose() toDispose = _disposables; _disposables = null; - ResolvedServices.Clear(); + // Not clearing ResolvedServices here because there might be a compilation running in background + // trying to get a cached singleton service instance and if it won't find it it will try to create a new one tripping the Debug.Assert in CaptureDisposable + // and leaking a Disposable object } return toDispose; From 87b53a9d659f03c7cb679e364f923c00c50aac9d Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 1 Feb 2019 12:39:32 -0800 Subject: [PATCH 2/3] Update ServiceProviderEngineScope.cs --- .../DI/src/ServiceLookup/ServiceProviderEngineScope.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/DependencyInjection/DI/src/ServiceLookup/ServiceProviderEngineScope.cs b/src/DependencyInjection/DI/src/ServiceLookup/ServiceProviderEngineScope.cs index 52dd9d5e228..7dc7462c2ce 100644 --- a/src/DependencyInjection/DI/src/ServiceLookup/ServiceProviderEngineScope.cs +++ b/src/DependencyInjection/DI/src/ServiceLookup/ServiceProviderEngineScope.cs @@ -128,8 +128,9 @@ private List BeginDispose() _disposables = null; // Not clearing ResolvedServices here because there might be a compilation running in background - // trying to get a cached singleton service instance and if it won't find it it will try to create a new one tripping the Debug.Assert in CaptureDisposable - // and leaking a Disposable object + // trying to get a cached singleton service instance and if it won't find + // it it will try to create a new one tripping the Debug.Assert in CaptureDisposable + // and leaking a Disposable object in Release mode } return toDispose; From cc262ff795cb5c4bf591f2997d7497e137f85ad7 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 1 Feb 2019 13:14:38 -0800 Subject: [PATCH 3/3] Add a test --- .../test/ServiceProviderEngineScopeTests.cs | 21 +++++++++++++++++++ .../DependencyInjection.sln | 6 +++--- 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 src/DependencyInjection/DI/test/ServiceProviderEngineScopeTests.cs diff --git a/src/DependencyInjection/DI/test/ServiceProviderEngineScopeTests.cs b/src/DependencyInjection/DI/test/ServiceProviderEngineScopeTests.cs new file mode 100644 index 00000000000..e93d30316c5 --- /dev/null +++ b/src/DependencyInjection/DI/test/ServiceProviderEngineScopeTests.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Extensions.DependencyInjection.Specification.Fakes; +using Xunit; + +namespace Microsoft.Extensions.DependencyInjection.ServiceLookup +{ + public class ServiceProviderEngineScopeTests + { + [Fact] + public void Dispose_DoesntClearResolvedServices() + { + var serviceProviderEngineScope = new ServiceProviderEngineScope(null); + serviceProviderEngineScope.ResolvedServices.Add(new ServiceCacheKey(typeof(IFakeService), 0), null); + serviceProviderEngineScope.Dispose(); + + Assert.Single(serviceProviderEngineScope.ResolvedServices); + } + } +} diff --git a/src/DependencyInjection/DependencyInjection.sln b/src/DependencyInjection/DependencyInjection.sln index 63b30d54e35..f7354882081 100644 --- a/src/DependencyInjection/DependencyInjection.sln +++ b/src/DependencyInjection/DependencyInjection.sln @@ -1,8 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28508.60 +MinimumVisualStudioVersion = 16.0.0.0 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DI", "DI", "{B4373F1E-3E9F-49DA-B1BD-CA440932CF52}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Extensions.DependencyInjection.Performance", "DI\perf\Microsoft.Extensions.DependencyInjection.Performance.csproj", "{27C11410-9269-452B-ACF6-BC2E46695DC3}"