From 229f15ea8a284e1eb992c78d1a18c9c1d6b61a23 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Tue, 17 Nov 2020 20:33:27 -0800 Subject: [PATCH 1/4] Fix NRE when default value is null and ServiceCallSite is not found (#44675) * Fix NRE when default value is null and ServiceCallSite is not found --- .../src/ServiceLookup/ConstantCallSite.cs | 6 ++-- .../tests/DI.Tests/CallSiteTests.cs | 31 +++++++++++++++++++ .../ServiceProviderCompilationTest.cs | 1 + 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.DependencyInjection/src/ServiceLookup/ConstantCallSite.cs b/src/libraries/Microsoft.Extensions.DependencyInjection/src/ServiceLookup/ConstantCallSite.cs index acc1d967f73805..bd09485c617f6c 100644 --- a/src/libraries/Microsoft.Extensions.DependencyInjection/src/ServiceLookup/ConstantCallSite.cs +++ b/src/libraries/Microsoft.Extensions.DependencyInjection/src/ServiceLookup/ConstantCallSite.cs @@ -7,10 +7,12 @@ namespace Microsoft.Extensions.DependencyInjection.ServiceLookup { internal class ConstantCallSite : ServiceCallSite { + private readonly Type _serviceType; internal object DefaultValue { get; } public ConstantCallSite(Type serviceType, object defaultValue): base(ResultCache.None) { + _serviceType = serviceType ?? throw new ArgumentNullException(nameof(serviceType)); if (defaultValue != null && !serviceType.IsInstanceOfType(defaultValue)) { throw new ArgumentException(SR.Format(SR.ConstantCantBeConvertedToServiceType, defaultValue.GetType(), serviceType)); @@ -19,8 +21,8 @@ public ConstantCallSite(Type serviceType, object defaultValue): base(ResultCache DefaultValue = defaultValue; } - public override Type ServiceType => DefaultValue.GetType(); - public override Type ImplementationType => DefaultValue.GetType(); + public override Type ServiceType => DefaultValue?.GetType() ?? _serviceType; + public override Type ImplementationType => DefaultValue?.GetType() ?? _serviceType; public override CallSiteKind Kind { get; } = CallSiteKind.Constant; } } diff --git a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/CallSiteTests.cs b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/CallSiteTests.cs index 3dc3cec6c64731..c83e27790b637d 100644 --- a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/CallSiteTests.cs +++ b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/CallSiteTests.cs @@ -264,6 +264,37 @@ public void DoesNotThrowWhenServiceIsUsedAsEnumerableAndNotInOneCallSite() Assert.NotNull(compileCallSite); } + [Theory] + [InlineData(ServiceProviderMode.Default)] + [InlineData(ServiceProviderMode.Dynamic)] + [InlineData(ServiceProviderMode.Runtime)] + [InlineData(ServiceProviderMode.Expressions)] + [InlineData(ServiceProviderMode.ILEmit)] + private void NoServiceCallsite_DefaultValueNull_DoesNotThrow(ServiceProviderMode mode) + { + var descriptors = new ServiceCollection(); + descriptors.AddTransient(); + + var provider = descriptors.BuildServiceProvider(mode); + ServiceF instance = ActivatorUtilities.CreateInstance(provider); + + Assert.NotNull(instance); + } + + private interface IServiceG + { + } + + private class ServiceG + { + public ServiceG(IServiceG service = null) { } + } + + private class ServiceF + { + public ServiceF(ServiceG service) { } + } + private class ServiceD { public ServiceD(IEnumerable services) diff --git a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ServiceProviderCompilationTest.cs b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ServiceProviderCompilationTest.cs index 5c6853e1b1c181..8094dde9364b1f 100644 --- a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ServiceProviderCompilationTest.cs +++ b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ServiceProviderCompilationTest.cs @@ -12,6 +12,7 @@ namespace Microsoft.Extensions.DependencyInjection.Tests public class ServiceProviderCompilationTest { [Theory] + [InlineData(ServiceProviderMode.Default, typeof(I999))] [InlineData(ServiceProviderMode.Dynamic, typeof(I999))] [InlineData(ServiceProviderMode.Runtime, typeof(I999))] [InlineData(ServiceProviderMode.ILEmit, typeof(I999))] From 69422ce4da5a8c24b6d4667ec7d9677d7b1f6d13 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Fri, 20 Nov 2020 19:36:24 -0800 Subject: [PATCH 2/4] packaging changes --- .../Directory.Build.props | 8 ++++++++ src/libraries/libraries-packages.proj | 1 + src/libraries/pkg/baseline/packageIndex.json | 14 ++++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 src/libraries/Microsoft.Extensions.DependencyInjection/Directory.Build.props diff --git a/src/libraries/Microsoft.Extensions.DependencyInjection/Directory.Build.props b/src/libraries/Microsoft.Extensions.DependencyInjection/Directory.Build.props new file mode 100644 index 00000000000000..1478d4bc5c60cc --- /dev/null +++ b/src/libraries/Microsoft.Extensions.DependencyInjection/Directory.Build.props @@ -0,0 +1,8 @@ + + + + Open + 5.0.1 + 5.0.0.1 + + \ No newline at end of file diff --git a/src/libraries/libraries-packages.proj b/src/libraries/libraries-packages.proj index f9abc538adcfa1..767a53756b1d2c 100644 --- a/src/libraries/libraries-packages.proj +++ b/src/libraries/libraries-packages.proj @@ -19,6 +19,7 @@ + diff --git a/src/libraries/pkg/baseline/packageIndex.json b/src/libraries/pkg/baseline/packageIndex.json index b6a5cd6c06363a..4050fc4e2f7209 100644 --- a/src/libraries/pkg/baseline/packageIndex.json +++ b/src/libraries/pkg/baseline/packageIndex.json @@ -507,11 +507,21 @@ "3.1.0", "3.1.1", "3.1.2", - "5.0.0" + "5.0.0", + "5.0.1", + "3.1.3", + "3.1.4", + "3.1.5", + "3.1.6", + "3.1.7", + "3.1.8", + "3.1.9", + "3.1.10" ], "InboxOn": {}, "AssemblyVersionInPackageVersion": { - "5.0.0.0": "5.0.0" + "5.0.0.0": "5.0.0", + "5.0.0.1": "5.0.1" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { From 65df681f53036f0b7ad6060ac6153ad2855ba52a Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Fri, 20 Nov 2020 19:59:40 -0800 Subject: [PATCH 3/4] correction --- src/libraries/pkg/baseline/packageIndex.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libraries/pkg/baseline/packageIndex.json b/src/libraries/pkg/baseline/packageIndex.json index 4050fc4e2f7209..537369bb0c4df0 100644 --- a/src/libraries/pkg/baseline/packageIndex.json +++ b/src/libraries/pkg/baseline/packageIndex.json @@ -508,7 +508,6 @@ "3.1.1", "3.1.2", "5.0.0", - "5.0.1", "3.1.3", "3.1.4", "3.1.5", From 46cbf57ddd9ed8106439e502a319cc556c31248f Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Tue, 24 Nov 2020 08:27:32 -0800 Subject: [PATCH 4/4] Feedback changes --- .../Directory.Build.props | 1 - src/libraries/pkg/baseline/packageIndex.json | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.DependencyInjection/Directory.Build.props b/src/libraries/Microsoft.Extensions.DependencyInjection/Directory.Build.props index 1478d4bc5c60cc..94276d35809fd8 100644 --- a/src/libraries/Microsoft.Extensions.DependencyInjection/Directory.Build.props +++ b/src/libraries/Microsoft.Extensions.DependencyInjection/Directory.Build.props @@ -1,7 +1,6 @@  - Open 5.0.1 5.0.0.1 diff --git a/src/libraries/pkg/baseline/packageIndex.json b/src/libraries/pkg/baseline/packageIndex.json index 537369bb0c4df0..2c3227bc02bc86 100644 --- a/src/libraries/pkg/baseline/packageIndex.json +++ b/src/libraries/pkg/baseline/packageIndex.json @@ -507,7 +507,6 @@ "3.1.0", "3.1.1", "3.1.2", - "5.0.0", "3.1.3", "3.1.4", "3.1.5", @@ -515,7 +514,8 @@ "3.1.7", "3.1.8", "3.1.9", - "3.1.10" + "3.1.10", + "5.0.0" ], "InboxOn": {}, "AssemblyVersionInPackageVersion": {