RSCG – ServiceScan.SourceGenerator
RSCG – ServiceScan.SourceGenerator
name | ServiceScan.SourceGenerator |
nuget | https://www.nuget.org/packages/ServiceScan.SourceGenerator/ |
link | https://github.com/Dreamescaper/ServiceScan.SourceGenerator |
author | Oleksandr Liakhevych |
Generating service collection / DI registration
This is how you can use ServiceScan.SourceGenerator .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> <ItemGroup> <PackageReference Include="ServiceScan.SourceGenerator" Version="1.1.2"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> </ItemGroup> </Project>
The code that you will use is
using InjectDemo; using Microsoft.Extensions.DependencyInjection; var sc=new ServiceCollection(); sc.AddMyServices(); var sp=sc.BuildServiceProvider(); var con = sp.GetService(typeof(Database)) as IDatabase; ArgumentNullException.ThrowIfNull(con); con.Open(); public static partial class MyServiceProvider { [ServiceScan.SourceGenerator.GenerateServiceRegistrations(AssignableTo = typeof(Database),AsSelf =true, Lifetime = ServiceLifetime.Scoped)] [ServiceScan.SourceGenerator.GenerateServiceRegistrations(AssignableTo = typeof(IDatabase), Lifetime = ServiceLifetime.Scoped)] public static partial IServiceCollection AddMyServices(this IServiceCollection services) ; }
namespace InjectDemo; partial class Database : IDatabase { private readonly IDatabase con; public Database(IDatabase con) { this.con = con; } public void Open() { Console.WriteLine($"open from database"); con.Open(); } }
namespace InjectDemo; public partial class DatabaseCon:IDatabase { public string? Connection { get; set; } public void Open() { Console.WriteLine("open from database con" ); } }
The code that is generated is
#nullable enable using System; using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; namespace ServiceScan.SourceGenerator; [Conditional("CODE_ANALYSIS")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] internal class GenerateServiceRegistrationsAttribute : Attribute { /// <summary> /// Set the assembly containing the given type as the source of types to register. /// If not specified, the assembly containing the method with this attribute will be used. /// </summary> public Type? FromAssemblyOf { get; set; } /// <summary> /// Set the type that the registered types must be assignable to. /// Types will be registered with this type as the service type, /// unless <see cref="AsImplementedInterfaces"/> or <see cref="AsSelf"/> is set. /// </summary> public Type? AssignableTo { get; set; } /// <summary> /// Set the lifetime of the registered services. /// <see cref="ServiceLifetime.Transient"/> is used if not specified. /// </summary> public ServiceLifetime Lifetime { get; set; } /// <summary> /// If set to true, types will be registered as implemented interfaces instead of their actual type. /// </summary> public bool AsImplementedInterfaces { get; set; } /// <summary> /// If set to true, types will be registered with their actual type. /// It can be combined with <see cref="AsImplementedInterfaces"/>, in that case implemeted interfaces will be /// "forwarded" to "self" implementation. /// </summary> public bool AsSelf { get; set; } /// <summary> /// Set this value to filter the types to register by their full name. /// You can use '*' wildcards. /// You can also use ',' to separate multiple filters. /// </summary> /// <example>Namespace.With.Services.*</example> /// <example>*Service,*Factory</example> public string? TypeNameFilter { get; set; } }
using Microsoft.Extensions.DependencyInjection; public static partial class MyServiceProvider { public static partial IServiceCollection AddMyServices(this IServiceCollection services) { return services .AddScoped<InjectDemo.Database, InjectDemo.Database>() .AddScoped<InjectDemo.IDatabase, InjectDemo.Database>() .AddScoped<InjectDemo.IDatabase, InjectDemo.DatabaseCon>(); } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/ServiceScan.SourceGenerator