diff --git a/src/Lamar.AspNetCoreTests/Bugs/Bug_395_keyed_service_closed_generic_interface_registration_check.cs b/src/Lamar.AspNetCoreTests/Bugs/Bug_395_keyed_service_closed_generic_interface_registration_check.cs new file mode 100644 index 00000000..9d5236f4 --- /dev/null +++ b/src/Lamar.AspNetCoreTests/Bugs/Bug_395_keyed_service_closed_generic_interface_registration_check.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using Lamar.Microsoft.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Shouldly; +using Xunit; + +namespace Lamar.AspNetCoreTests.Bugs; + +public class Bug_395_keyed_service_closed_generic_interface_registration_check +{ + class ClassA {} + + interface IGenericService {} + + class ServiceA : IGenericService {} + + [Fact] + public void do_not_blow_up() + { + var serviceName = "MyServiceName"; + + var builder = new HostBuilder() + .ConfigureServices((context, services) => + { + // This is needed because of https://github.com/aspnet/Logging/issues/691 + services.AddSingleton(sp => + new LoggerFactory( + sp.GetRequiredService>(), + sp.GetRequiredService>() + ) + ); + + services.AddKeyedTransient, ServiceA>(serviceName); + }) + .UseLamar(); + + using (var host = builder.Start()) + { + var container = host.Services.ShouldBeOfType(); + + container.GetInstance>() + .ShouldNotBeNull(); + } + } +} \ No newline at end of file diff --git a/src/Lamar/ServiceGraph.cs b/src/Lamar/ServiceGraph.cs index 1ab77403..f2d311c4 100644 --- a/src/Lamar/ServiceGraph.cs +++ b/src/Lamar/ServiceGraph.cs @@ -268,7 +268,9 @@ private ServiceFamily buildFamilyForInstanceGroup(IServiceCollection services, private ServiceFamily buildClosedGenericType(Type serviceType, IServiceCollection services) { - var closed = services.Where(x => x.ServiceType == serviceType && !x.ImplementationType.IsOpenGeneric()) + var closed = services.Where(x => x.ServiceType == serviceType && (x.IsKeyedService + ? !x.KeyedImplementationType.IsOpenGeneric() + : !x.ImplementationType.IsOpenGeneric())) .Select(Instance.For); var templated = services