@@ -268,7 +268,6 @@ public static partial void ProcessServices()
268268 Assert . Equal ( expected , results . GeneratedTrees [ 1 ] . ToString ( ) ) ;
269269 }
270270
271-
272271 [ Fact ]
273272 public void AddMultipleCustomHandlerAttributesWithSameCustomHandler ( )
274273 {
@@ -319,6 +318,85 @@ public static partial void ProcessServices()
319318 Assert . Equal ( expected , results . GeneratedTrees [ 1 ] . ToString ( ) ) ;
320319 }
321320
321+ [ Fact ]
322+ public void ResolveCustomHandlerGenericArguments ( )
323+ {
324+ var source = $$ """
325+ using ServiceScan.SourceGenerator;
326+
327+ namespace GeneratorTests;
328+
329+ public static partial class ModelBuilderExtensions
330+ {
331+ [GenerateServiceRegistrations(AssignableTo = typeof(IEntityTypeConfiguration<>), CustomHandler = nameof(ApplyConfiguration))]
332+ public static partial ModelBuilder ApplyEntityConfigurations(this ModelBuilder modelBuilder);
333+
334+ private static void ApplyConfiguration<T, TEntity>(ModelBuilder modelBuilder)
335+ where T : IEntityTypeConfiguration<TEntity>, new()
336+ where TEntity : class
337+ {
338+ modelBuilder.ApplyConfiguration(new T());
339+ }
340+ }
341+ """ ;
342+
343+ var infra = """
344+ public interface IEntityTypeConfiguration<TEntity> where TEntity : class
345+ {
346+ void Configure(EntityTypeBuilder<TEntity> builder);
347+ }
348+
349+ public class EntityTypeBuilder<TEntity> where TEntity : class;
350+
351+ public class ModelBuilder
352+ {
353+ public ModelBuilder ApplyConfiguration<TEntity>(IEntityTypeConfiguration<TEntity> configuration) where TEntity : class
354+ {
355+ return this;
356+ }
357+ }
358+ """ ;
359+
360+ var configurations = """
361+ namespace GeneratorTests;
362+
363+ public class EntityA;
364+ public class EntityB;
365+
366+ public class EntityAConfiguration : IEntityTypeConfiguration<EntityA>
367+ {
368+ public void Configure(EntityTypeBuilder<EntityA> builder) { }
369+ }
370+
371+ public class EntityBConfiguration : IEntityTypeConfiguration<EntityB>
372+ {
373+ public void Configure(EntityTypeBuilder<EntityB> builder) { }
374+ }
375+ """ ;
376+
377+ var compilation = CreateCompilation ( source , infra , configurations ) ;
378+
379+ var results = CSharpGeneratorDriver
380+ . Create ( _generator )
381+ . RunGenerators ( compilation )
382+ . GetRunResult ( ) ;
383+
384+ var expected = $$ """
385+ namespace GeneratorTests;
386+
387+ public static partial class ModelBuilderExtensions
388+ {
389+ public static partial global::ModelBuilder ApplyEntityConfigurations(this global::ModelBuilder modelBuilder)
390+ {
391+ ApplyConfiguration<global::GeneratorTests.EntityAConfiguration, global::GeneratorTests.EntityA>(modelBuilder);
392+ ApplyConfiguration<global::GeneratorTests.EntityBConfiguration, global::GeneratorTests.EntityB>(modelBuilder);
393+ return modelBuilder;
394+ }
395+ }
396+ """ ;
397+ Assert . Equal ( expected , results . GeneratedTrees [ 1 ] . ToString ( ) ) ;
398+ }
399+
322400
323401 private static Compilation CreateCompilation ( params string [ ] source )
324402 {
0 commit comments