RSCG – FactoryGenerator.Abstractions

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


Posted

in

, ,

by

Tags: