diff --git a/src/LightInject.Microsoft.DependencyInjection.Tests/DefaultServiceTests.cs b/src/LightInject.Microsoft.DependencyInjection.Tests/DefaultServiceTests.cs new file mode 100644 index 0000000..34ddc55 --- /dev/null +++ b/src/LightInject.Microsoft.DependencyInjection.Tests/DefaultServiceTests.cs @@ -0,0 +1,98 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace LightInject.Microsoft.DependencyInjection.Tests; + +public class DefaultServiceTests +{ + [Fact] + public void ShouldOverrideDefaultRegistrationInServiceContainer() + { + var container = new ServiceContainer(options => options.WithMicrosoftSettings()); + container.RegisterTransient(); + var serviceCollection = new ServiceCollection(); + + serviceCollection.AddSingleton(); + + var provider = container.CreateServiceProvider(serviceCollection); + + var foo = provider.GetRequiredService(); + + Assert.IsType(foo); + } + + [Fact] + public void ShouldOverrideNamedRegistrationInServiceContainer() + { + var container = new ServiceContainer(options => options.WithMicrosoftSettings()); + container.RegisterTransient("Foo"); + var serviceCollection = new ServiceCollection(); + + serviceCollection.AddSingleton(); + + var provider = container.CreateServiceProvider(serviceCollection); + + var foo = provider.GetRequiredService(); + + Assert.IsType(foo); + } + + [Fact] + public void ShouldOverrideMultipleNamedRegistrationInServiceContainer() + { + var container = new ServiceContainer(options => options.WithMicrosoftSettings()); + container.RegisterTransient("Foo1"); + container.RegisterTransient("Foo2"); + var serviceCollection = new ServiceCollection(); + + serviceCollection.AddSingleton(); + + var provider = container.CreateServiceProvider(serviceCollection); + + var foo = provider.GetRequiredService(); + + Assert.IsType(foo); + } + + [Fact] + public void ShouldOverrideNamedAndDefaultRegistrationInServiceContainer() + { + var container = new ServiceContainer(options => options.WithMicrosoftSettings()); + container.RegisterTransient(); + container.RegisterTransient("Foo"); + var serviceCollection = new ServiceCollection(); + + serviceCollection.AddSingleton(); + + var provider = container.CreateServiceProvider(serviceCollection); + + var foo = provider.GetRequiredService(); + + Assert.IsType(foo); + } + + + [Fact] + public void ShouldUseLast() + { + var container = new ServiceContainer(options => options.WithMicrosoftSettings()); + container.RegisterTransient("Foo1"); + container.RegisterTransient("Foo2"); + var serviceCollection = new ServiceCollection(); + + serviceCollection.AddSingleton(); + + var provider = container.CreateServiceProvider(serviceCollection); + + var foo = provider.GetRequiredService(); + + Assert.IsType(foo); + } + + public interface IFoo { } + + public class Foo : IFoo { } + + public class AnotherFoo : IFoo { } +} \ No newline at end of file diff --git a/src/LightInject.Microsoft.DependencyInjection.Tests/ServiceProviderFactoryTests.cs b/src/LightInject.Microsoft.DependencyInjection.Tests/ServiceProviderFactoryTests.cs index d021bcf..086a0e9 100644 --- a/src/LightInject.Microsoft.DependencyInjection.Tests/ServiceProviderFactoryTests.cs +++ b/src/LightInject.Microsoft.DependencyInjection.Tests/ServiceProviderFactoryTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; using Microsoft.Extensions.DependencyInjection; using Xunit; @@ -92,7 +93,7 @@ public void ShouldPickServiceWithoutServiceNameAsDefaultIfRegistered() { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(p => "42"); - var factory = new LightInjectServiceProviderFactory(); + var factory = new LightInjectServiceProviderFactory(options => options.DefaultServiceSelector = serviceNames => serviceNames.SingleOrDefault(string.IsNullOrWhiteSpace) ?? serviceNames.Last()); var container = factory.CreateBuilder(serviceCollection); container.Register(f => "84"); diff --git a/src/LightInject.Microsoft.DependencyInjection/LightInject.Microsoft.DependencyInjection.cs b/src/LightInject.Microsoft.DependencyInjection/LightInject.Microsoft.DependencyInjection.cs index e2512a0..9738906 100644 --- a/src/LightInject.Microsoft.DependencyInjection/LightInject.Microsoft.DependencyInjection.cs +++ b/src/LightInject.Microsoft.DependencyInjection/LightInject.Microsoft.DependencyInjection.cs @@ -119,10 +119,24 @@ private static void RegisterServices(IServiceContainer container, Scope rootScop { var registrations = serviceCollection.Select(d => CreateServiceRegistration(d, rootScope)).ToList(); + var servicesThatRequireNamePrefix = container.AvailableServices + .GroupBy(si => si.ServiceType) + .Select(g => new { ServiceType = g.Key, Prefix = g.OrderBy(g => g.ServiceName).Last().ServiceName }) + .ToDictionary(g => g.ServiceType, g => g.Prefix); + + + for (int i = 0; i < registrations.Count; i++) { ServiceRegistration registration = registrations[i]; - registration.ServiceName = i.ToString("D8", CultureInfo.InvariantCulture.NumberFormat); + if (servicesThatRequireNamePrefix.TryGetValue(registration.ServiceType, out string prefix)) + { + registration.ServiceName = prefix + i.ToString("D8", CultureInfo.InvariantCulture.NumberFormat); + } + else + { + registration.ServiceName = i.ToString("D8", CultureInfo.InvariantCulture.NumberFormat); + } container.Register(registration); } } @@ -234,7 +248,8 @@ public static class ContainerOptionsExtensions /// . public static ContainerOptions WithMicrosoftSettings(this ContainerOptions options) { - options.DefaultServiceSelector = serviceNames => serviceNames.SingleOrDefault(string.IsNullOrWhiteSpace) ?? serviceNames.Last(); + //options.DefaultServiceSelector = serviceNames => serviceNames.SingleOrDefault(string.IsNullOrWhiteSpace) ?? serviceNames.Last(); + options.DefaultServiceSelector = serviceNames => serviceNames.Last(); options.EnablePropertyInjection = false; options.EnableCurrentScope = false; options.EnableOptionalArguments = true;