< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Dispatcher.DependencyInjectionWithLegacyFallbackInstanceProvider
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Dispatcher/DependencyInjectionWithLegacyFallbackInstanceProvider.cs
Line coverage
95%
Covered lines: 42
Uncovered lines: 2
Coverable lines: 44
Total lines: 125
Line coverage: 95.4%
Branch coverage
78%
Covered branches: 11
Total branches: 14
Branch coverage: 78.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%11100%
Attach(...)100%11100%
Detach(...)100%11100%
GetService(...)100%11100%
Dispose()50%22100%
GetKeyedService(...)100%11100%
GetRequiredKeyedService(...)100%110%
.ctor(...)50%44100%
GetInstance(...)100%110%
GetInstance(...)100%11100%
ReleaseInstance(...)100%11100%
ReleaseInstanceLegacy(...)100%22100%
ReleaseServiceScope(...)100%11100%
GetInstanceFromDIWithLegacyFallback(...)100%44100%
GetInstanceFromDI(...)100%22100%
GetScopedServiceProviderExtension(...)100%11100%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Dispatcher/DependencyInjectionWithLegacyFallbackInstanceProvider.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System;
 5using CoreWCF.Channels;
 6using Microsoft.Extensions.DependencyInjection;
 7
 8namespace CoreWCF.Dispatcher
 9{
 10    internal class DependencyInjectionWithLegacyFallbackInstanceProvider : IInstanceProvider
 11    {
 12        private class ScopedServiceProviderExtension : IExtension<InstanceContext>, IKeyedServiceProvider, IDisposable
 13        {
 14            private readonly IServiceScope _serviceScope;
 415            private IKeyedServiceProvider KeyedServiceProvider { get; }
 16
 190617            public ScopedServiceProviderExtension(IServiceProvider serviceProvider)
 18            {
 190619                _serviceScope = serviceProvider.CreateScope();
 190620                KeyedServiceProvider = _serviceScope.ServiceProvider as IKeyedServiceProvider;
 190621            }
 22
 23            public void Attach(InstanceContext owner)
 24            {
 25                // intentionally left blank
 190626            }
 27
 28            public void Detach(InstanceContext owner)
 29            {
 30                // intentionally left blank
 190631            }
 32
 190833            public object GetService(Type serviceType) => _serviceScope.ServiceProvider.GetService(serviceType);
 34
 190635            public void Dispose() => _serviceScope?.Dispose();
 36
 437            public object GetKeyedService(Type serviceType, object serviceKey) => KeyedServiceProvider.GetKeyedService(s
 38
 039            public object GetRequiredKeyedService(Type serviceType, object serviceKey) => KeyedServiceProvider.GetRequir
 40        }
 41
 42        private delegate object GetInstanceDelegate(InstanceContext instanceContext);
 43        private delegate void ReleaseInstanceDelegate(InstanceContext instanceContext, object instance);
 44
 45        private readonly IServiceProvider _serviceProvider;
 46        private readonly IServiceProviderIsService _serviceProviderIsService;
 47        private readonly Type _serviceType;
 48        private GetInstanceDelegate _getInstanceDelegate;
 49        private ReleaseInstanceDelegate _releaseInstanceDelegate;
 50
 50351        public DependencyInjectionWithLegacyFallbackInstanceProvider(IServiceProvider serviceProvider, Type serviceType)
 52        {
 50353            _serviceProvider = serviceProvider ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameo
 50354            _serviceType = serviceType ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(servic
 55
 50356            _serviceProviderIsService = _serviceProvider.GetRequiredService<IServiceProviderIsService>();
 50357            _getInstanceDelegate = GetInstanceFromDIWithLegacyFallback;
 58            // Defaults to ReleaseInstanceLegacy
 50359            _releaseInstanceDelegate = ReleaseInstanceLegacy;
 50360        }
 61
 62        public object GetInstance(InstanceContext instanceContext)
 063            => GetInstance(instanceContext, null);
 64
 65        public object GetInstance(InstanceContext instanceContext, Message message)
 238966            => _getInstanceDelegate(instanceContext);
 67
 68        public void ReleaseInstance(InstanceContext instanceContext, object instance)
 238769            => _releaseInstanceDelegate(instanceContext, instance);
 70
 71        public void ReleaseInstanceLegacy(InstanceContext instanceContext, object instance)
 48172            => (instance as IDisposable)?.Dispose();
 73
 74        public void ReleaseServiceScope(InstanceContext instanceContext, object instance)
 75        {
 190676            var extension = GetScopedServiceProviderExtension(instanceContext);
 190677            instanceContext.Extensions.Remove(extension);
 190678            extension.Dispose();
 190679        }
 80
 81        private object GetInstanceFromDIWithLegacyFallback(InstanceContext instanceContext)
 82        {
 41683            if (_serviceProviderIsService.IsService(_serviceType))
 84            {
 14685                var extension = new ScopedServiceProviderExtension(_serviceProvider);
 14686                instanceContext.Extensions.Add(extension);
 87
 88                // Overwrite _getInstanceDelegate so subsequent calls pull instance from ServiceScope
 14689                _getInstanceDelegate = GetInstanceFromDI;
 90                // Overwrite _releaseInstanceDelegate so subsequent calls release the ServiceScope and thus instance pul
 14691                _releaseInstanceDelegate = ReleaseServiceScope;
 92
 14693                return extension.GetService(_serviceType);
 94            }
 95
 27096            if (InvokerUtil.HasDefaultConstructor(_serviceType))
 97            {
 26998                CreateInstanceDelegate createInstance = InvokerUtil.GenerateCreateInstanceDelegate(_serviceType);
 75199                _getInstanceDelegate = _ => createInstance();
 100            }
 101            else // Fallback to throwing exception if not in DI and no default constructor
 102            {
 2103                _getInstanceDelegate = _ => throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperati
 2104                    SR.Format(SR.SFxNoDefaultConstructor, _serviceType.FullName)));
 105            }
 106
 270107            return _getInstanceDelegate(instanceContext);
 108        }
 109
 110        private object GetInstanceFromDI(InstanceContext instanceContext)
 111        {
 1760112            ScopedServiceProviderExtension extension = GetScopedServiceProviderExtension(instanceContext);
 1760113            if (extension == null)
 114            {
 1760115                extension = new ScopedServiceProviderExtension(_serviceProvider);
 1760116                instanceContext.Extensions.Add(extension);
 117            }
 118
 1760119            return extension.GetService(_serviceType);
 120        }
 121
 122        private static ScopedServiceProviderExtension GetScopedServiceProviderExtension(InstanceContext instanceContext)
 3666123            => instanceContext.Extensions.Find<ScopedServiceProviderExtension>();
 124    }
 125}