Skip to content

ignatandrei/FunctionsDI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FunctionsDI

Nuget

Generate (constructor) and functions calls similar with ASP.NET Core WebAPI ( [FromServices] will be provided by DI ) Also, verifies for null .

Usage 1 - generate constructors from methods

Reference into the csproj

<ItemGroup>
    <PackageReference Include="RSCG_FunctionsWithDI" Version="2022.7.7.636" ReferenceOutputAssembly="false" OutputItemType="Analyzer" />
    <PackageReference Include="RSCG_FunctionsWithDI_Base" Version="2022.7.7.636" />
</ItemGroup> 	
<PropertyGroup>
		<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
		<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)GeneratedX</CompilerGeneratedFilesOutputPath>
	</PropertyGroup>

Then for every class you can write [FromServices]

using RSCG_FunctionsWithDI_Base;
//namespace if necessary
public partial class TestDIFunction
{
    public bool TestMyFunc1([FromServices] TestDI1 t1, [FromServices] TestDI2 t2, int x, int y)
    {
        return true;
    }
    //more functions
}

generates the constructor with needed details

public partial class TestDIFunction
{ 
private TestDI1 _TestDI1;
private TestDI2 _TestDI2;
public TestDIFunction  (TestDI1 _TestDI1,TestDI2 _TestDI2) //constructor generated with needed DI
 { 
this._TestDI1=_TestDI1;
this._TestDI2=_TestDI2;

 } //end constructor 

//making call to TestMyFunc1
public bool TestMyFunc1(int  x,int  y){ 
var t1 = this._TestDI1  ;
if(t1 == null) throw new ArgumentException(" service TestDI1  is null in TestDIFunction ");
var t2 = this._TestDI2  ;
if(t2 == null) throw new ArgumentException(" service TestDI2  is null in TestDIFunction ");
return  TestMyFunc1(t1,t2,x,y);
}

so you can call

var test=serviceProvider.GetService<TestDIFunction>();
Console.WriteLine(test.TestMyFunc1(10,3)); // calling without the [FromServices] arguments

Usage 2 - generate constructors from fields / constructors

<ItemGroup>
    <PackageReference Include="RSCG_FunctionsWithDI" Version="2022.7.7.636" ReferenceOutputAssembly="false" OutputItemType="Analyzer" />
    <PackageReference Include="RSCG_FunctionsWithDI_Base" Version="2022.7.7.636" />
</ItemGroup>	
<PropertyGroup>
		<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
		<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)GeneratedX</CompilerGeneratedFilesOutputPath>
	</PropertyGroup>

Assuming this classes, that you want to keep a minimum of parameters constructors

public partial class TestDIFunctionAdvWithConstructor
    {
        [RSCG_FunctionsWithDI_Base.FromServices]
        private TestDI1 NewTestDI1;

        [RSCG_FunctionsWithDI_Base.FromServices]
        public TestDI2 NewTestDI2 { get; set; }

        public readonly TestDI3 myTestDI3;

        private TestDIFunctionAdvWithConstructor(TestDI3 test)
        {
            myTestDI3= test;
        }
        
    }
    public partial class TestDIFunctionAdvNoConstructor
    {
        [RSCG_FunctionsWithDI_Base.FromServices]
        public TestDI1 NewTestDI1;

        [RSCG_FunctionsWithDI_Base.FromServices]
        private TestDI2 NewTestDI2 { get; set; }




    }

the generator will generate

namespace TestFunctionsWithDI

{ 
public partial class TestDIFunctionAdvNoConstructor
{ 
public TestDIFunctionAdvNoConstructor( TestDI1 _NewTestDI1,TestDI2 _NewTestDI2 ) 
{ 
this.NewTestDI1 = _NewTestDI1; 
this.NewTestDI2 = _NewTestDI2; 
}//end constructor 

 }//class
 }//namespace


namespace TestFunctionsWithDI

{ 
public partial class TestDIFunctionAdvWithConstructor
{ 
public TestDIFunctionAdvWithConstructor(TestDI3 test, TestDI1 _NewTestDI1, TestDI2 _NewTestDI2) : this (test) 
{ 
this.NewTestDI1 = _NewTestDI1; 
this.NewTestDI2 = _NewTestDI2; 
}//end constructor 

 }//class
 }//namespace

Enjoy!

More Roslyn Source Code Generators

You can find more RSCG with examples at Roslyn Source Code Generators

About

DI for functions

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

 

Packages

No packages published

Languages