Proof-of-concept DI container based on source generators.
Features:
-
Specify dependencies and their access modifiers with generic attributes:
[Component, DependsOn<PrivateProtected, Class1, Class2, Class3, Class4>] public partial class Class5 { }
Source generator will generate constructor and fields for dependencies.
-
Register components as selected interface:
[Component, As<IClass11>] public partial class Class1 : IClass1, IClass11 { }
-
Override components in dependant projects:
[Component, Overrides<Class2>] public partial class Class3 : Class2 { }
-
Query several dependencies implementing same interface:
[Component, DependsOn<Internal, IEnumerable<IClass1>>()] public partial class Class3 { }
-
Specify ordering of dependencies with Before and After attributes:
[Component, Before<Class6, Class7>, After<Class8>] public partial class Class5 { }
-
Specify end-projects for which the resolver will be generated:
[assembly: GenerateResolver]
TestConsoleAppInitializer.Initialize(); TestConsoleAppResolver.ResolveOrThrow<Class1>()
-
Specify naming rules with
Directory.Build.props<Project> <ItemGroup> <CompilerVisibleProperty Include="ManualfacDependencySuffix" /> <CompilerVisibleProperty Include="ManualfacDependencyPrefix" /> </ItemGroup> <PropertyGroup> <ManualfacDependencySuffix>suffix</ManualfacDependencySuffix> <ManualfacDependencyPrefix>prefix</ManualfacDependencyPrefix> </PropertyGroup> </Project>
Todos:
- Different lifetimes of components?
- Integration with other containers, like ASP NET Core default one, autofac...
- Test it against nuget packages
- Feature flags? Zones?
- More configurable naming