{
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));
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;
}
}
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<ServiceG>();
+
+ var provider = descriptors.BuildServiceProvider(mode);
+ ServiceF instance = ActivatorUtilities.CreateInstance<ServiceF>(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<ServiceA> services)
public class ServiceProviderCompilationTest
{
[Theory]
+ [InlineData(ServiceProviderMode.Default, typeof(I999))]
[InlineData(ServiceProviderMode.Dynamic, typeof(I999))]
[InlineData(ServiceProviderMode.Runtime, typeof(I999))]
[InlineData(ServiceProviderMode.ILEmit, typeof(I999))]