RSCG – FactoryGenerator.Abstractions
| name | FactoryGenerator.Abstractions |
| nuget |
https://www.nuget.org/packages/FactoryGenerator.Abstractions/ https://www.nuget.org/packages/FactoryGenerator.Microsoft.Extensions.DependencyInjection/ |
| link | https://github.com/ivmazurenko/factory-generator |
| author | Ivan Mazurenko |
Generating DI Factory based on the first parameter(s)
This is how you can use FactoryGenerator.Abstractions .
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="FactoryGenerator.Abstractions" Version="0.0.23" />
<PackageReference Include="FactoryGenerator.Microsoft.Extensions.DependencyInjection" Version="0.0.22" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.8" />
</ItemGroup>
</Project>
The code that you will use is
using FactoryGenerator.Abstractions;
using InjectDemo;
using Microsoft.Extensions.DependencyInjection;
using System;
using AutoGeneratedNamespaceFromFactoryGenerator;
Console.WriteLine("Hello, World!");
var services = new ServiceCollection();
services.RegisterGeneratedFactories();
var prov = services.BuildServiceProvider();
var factory = prov.GetRequiredService<IFactory<PersonType, PersonFactory>>();
var factoryEmployee = factory.Create(PersonType.Employee);
Console.WriteLine(factoryEmployee.Create().TypeName);
using FactoryGenerator.Abstractions;
namespace InjectDemo;
public enum PersonType
{
Employee,
Customer
}
[GenerateIFactory<PersonType>]
public class PersonFactory
{
private readonly PersonType person;
public PersonFactory(PersonType person)
{
this.person = person;
}
public Person Create()
{
return person switch
{
PersonType.Employee => new Employee()
{
TypeName = nameof(Employee)
},
PersonType.Customer => new Customer()
{
TypeName = nameof(Customer)
},
_ => throw new NotImplementedException()
};
}
}
public class Person
{
public string Name { get; set; } = string.Empty;
public string TypeName { get;init; } = string.Empty;
}
public class Employee : Person
{
}
public class Customer : Person
{
}
The code that is generated is
// <auto-generated/>
using FactoryGenerator.Abstractions;
using Microsoft.Extensions.DependencyInjection;
namespace AutoGeneratedNamespaceFromFactoryGenerator;
public static class ServiceCollectionExtensions
{
public static IServiceCollection RegisterGeneratedFactories(this IServiceCollection self)
{
self.AddTransient<FactoryGenerator.Abstractions.IFactory<global::InjectDemo.PersonType, InjectDemo.PersonFactory>, InjectDemo.PersonTypePersonFactoryFactory>();
return self;
}
}
// <auto-generated/>
using FactoryGenerator.Abstractions;
namespace InjectDemo;
public sealed class PersonTypePersonFactoryFactory : FactoryGenerator.Abstractions.IFactory<global::InjectDemo.PersonType, InjectDemo.PersonFactory>
{
public PersonTypePersonFactoryFactory()
{
}
public InjectDemo.PersonFactory Create(global::InjectDemo.PersonType dependency0)
{
return new InjectDemo.PersonFactory(dependency0);
}
}
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/FactoryGenerator.Abstractions