diff --git a/src/ReferenceResolver/AnalyzerReferenceLoader.cs b/src/ReferenceResolver/AnalyzerReferenceLoader.cs index 863eaa9..65714e5 100644 --- a/src/ReferenceResolver/AnalyzerReferenceLoader.cs +++ b/src/ReferenceResolver/AnalyzerReferenceLoader.cs @@ -16,7 +16,9 @@ private AnalyzerAssemblyLoader() public Assembly LoadFromPath(string fullPath) { +#pragma warning disable IL2026 return Assembly.LoadFrom(fullPath); +#pragma warning restore IL2026 } public void AddDependencyLocation(string fullPath) diff --git a/src/ReferenceResolver/DependencyInjectionExtensions.cs b/src/ReferenceResolver/DependencyInjectionExtensions.cs index 0245640..27f0e56 100644 --- a/src/ReferenceResolver/DependencyInjectionExtensions.cs +++ b/src/ReferenceResolver/DependencyInjectionExtensions.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using System.Diagnostics.CodeAnalysis; namespace ReferenceResolver; @@ -13,24 +14,23 @@ public static IServiceCollection AddReferenceResolvers(this IServiceCollection s ArgumentNullException.ThrowIfNull(serviceCollection); serviceCollection.AddLogging(); serviceCollection.TryAddSingleton(); - // reference resolver + // reference resolvers serviceCollection.TryAddSingleton(); - serviceCollection - .TryAddReferenceResolver() - .TryAddReferenceResolver() - .TryAddReferenceResolver() - .TryAddReferenceResolver() - .TryAddReferenceResolver() - ; + serviceCollection.TryAddReferenceResolver(ReferenceType.LocalFile); + serviceCollection.TryAddReferenceResolver(ReferenceType.LocalFolder); + serviceCollection.TryAddReferenceResolver(ReferenceType.FrameworkReference); + serviceCollection.TryAddReferenceResolver(ReferenceType.ProjectReference); + serviceCollection.TryAddReferenceResolver(ReferenceType.NuGetPackage); return serviceCollection; } - public static IServiceCollection TryAddReferenceResolver(this IServiceCollection serviceCollection) + private static IServiceCollection TryAddReferenceResolver + <[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TResolver> + (this IServiceCollection serviceCollection, ReferenceType referenceType) where TResolver : class, IReferenceResolver { - ArgumentNullException.ThrowIfNull(serviceCollection); serviceCollection.TryAddSingleton(); - serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton()); + serviceCollection.AddKeyedSingleton(referenceType.ToString()); return serviceCollection; } } diff --git a/src/ReferenceResolver/ReferenceResolver.csproj b/src/ReferenceResolver/ReferenceResolver.csproj index fa444fb..c95d8ef 100644 --- a/src/ReferenceResolver/ReferenceResolver.csproj +++ b/src/ReferenceResolver/ReferenceResolver.csproj @@ -8,6 +8,7 @@ true $(NoWarn);NU5104 + true diff --git a/src/ReferenceResolver/ReferenceResolverFactory.cs b/src/ReferenceResolver/ReferenceResolverFactory.cs index d90c65a..49f521a 100644 --- a/src/ReferenceResolver/ReferenceResolverFactory.cs +++ b/src/ReferenceResolver/ReferenceResolverFactory.cs @@ -31,14 +31,23 @@ public static IReference ParseReference(string referenceWithSchema) public IReferenceResolver GetResolver(ReferenceType referenceType) { + if (_serviceProvider is IKeyedServiceProvider keyedServiceProvider) + { + var referenceResolver = keyedServiceProvider.GetKeyedService(referenceType.ToString()); + if (referenceResolver is not null) + { + return referenceResolver; + } + } + return referenceType switch { - ReferenceType.LocalFile => _serviceProvider.GetServiceOrCreateInstance(), - ReferenceType.LocalFolder => _serviceProvider.GetServiceOrCreateInstance(), + ReferenceType.LocalFile => ActivatorUtilities.GetServiceOrCreateInstance(_serviceProvider), + ReferenceType.LocalFolder => ActivatorUtilities.GetServiceOrCreateInstance(_serviceProvider), ReferenceType.NuGetPackage => _serviceProvider.GetService() ?? new NuGetReferenceResolver(new NuGetHelper(NullLoggerFactory.Instance)), ReferenceType.FrameworkReference => - _serviceProvider.GetServiceOrCreateInstance(), - ReferenceType.ProjectReference => _serviceProvider.GetServiceOrCreateInstance(), + ActivatorUtilities.GetServiceOrCreateInstance(_serviceProvider), + ReferenceType.ProjectReference => ActivatorUtilities.GetServiceOrCreateInstance(_serviceProvider), _ => throw new ArgumentOutOfRangeException(nameof(referenceType)) }; } diff --git a/tests/IntegrationTest/ReferenceResolverExtensionsTests.cs b/tests/IntegrationTest/ReferenceResolverExtensionsTests.cs index fba70c6..d69c9cb 100644 --- a/tests/IntegrationTest/ReferenceResolverExtensionsTests.cs +++ b/tests/IntegrationTest/ReferenceResolverExtensionsTests.cs @@ -8,11 +8,16 @@ namespace IntegrationTest; public class ReferenceResolverExtensionsTests(IServiceProvider serviceProvider) { - [Fact] - public void ResolversRegisterTest() + [Theory] + [InlineData(ReferenceType.LocalFile)] + [InlineData(ReferenceType.LocalFolder)] + [InlineData(ReferenceType.ProjectReference)] + [InlineData(ReferenceType.FrameworkReference)] + [InlineData(ReferenceType.NuGetPackage)] + public void ResolversResolveTest(ReferenceType referenceType) { - var resolvers = serviceProvider.GetServices().ToArray(); - Assert.Equal(5, resolvers.Length); + var resolver = serviceProvider.GetKeyedService(referenceType.ToString()); + Assert.NotNull(resolver); } [Fact]