lsoft / DpdtInject

Highly efficient compile-time general purpose DI container based on C# source generators.
https://www.nuget.org/packages/Dpdt.Injector/
MIT License
32 stars 3 forks source link

improve open generics with constraints? #57

Open lsoft opened 2 years ago

lsoft commented 2 years ago

now we have:

//the following statement will bind A0 and A2; A1 will be excluded due to IExclude<>
ScanInAssembliesWith<A0>()
    .SelectAllWithOpenGeneric<IA<object, object>>() //generic arguments 'object' means NOTHING! it will be removed by Dpdt, so IA<object, object> will be transformed into IA<,> (open generic)
    .ExcludeAllWithOpenGeneric<IExclude<object, object>>() //again, 'object' means nothing, as above
    .FromAllInterfaces()
    .ToItself()
    .WithSingletonScope()
    ;

we may want to add an additional constraints for conventional search:

//the following statement will bind A0 and A2; A1 will be excluded due to IExclude<>
ScanInAssembliesWith<A0>()
    .SelectAllWithOpenGeneric<IA<object, object>>() //generic arguments 'object' means NOTHING! it will be removed by Dpdt, so IA<object, object> will be transformed into IA<,> (open generic)
    .ApplyGenericConstraintChildAt<1, SomeClass>() //applies a generic constraint at second generic parameter IA<,here> to be derived from SomeClass; so IA<,> transformed to IA<,any child of SomeClass>
    //ApplyGenericConstraintChildAt applied to the previous SelectAllWithOpenGeneric declaration
    .ExcludeAllWithOpenGeneric<IExclude<object, object>>() //again, 'object' means nothing, as above
    .ApplyGenericConstraintChildOrItselfAt<0, ExcludedClass>() //applies a generic constraint at first generic parameter IExclude<here,> to be derived from ExcludedClass; so IExclude<,> transformed to IExclude<any child of ExcludedClass or itself,>
    .FromAllInterfaces()
    .ToItself()
    .WithSingletonScope()
    ;

//new constraints:
//ApplyGenericConstraintChildAt
//ApplyGenericConstraintChildOrItselfAt

or:

//ApplyGenericConstraint<ChildAt<...>>
//ApplyGenericConstraint<ChildOrItselfAt<...>>