This commit is contained in:
Stef Heyenrath
2021-07-25 11:35:32 +02:00
parent e00c0c7706
commit 5524f6b0bc
2 changed files with 102 additions and 1 deletions
+70 -1
View File
@@ -1 +1,70 @@
# ProxyInterfaceSourceGenerator
# ProxyInterfaceSourceGenerator
This project uses Source Generation to generate an interface and a Proxy class for classes.
This makes it possible to wrap external classes which do not have an interface, in a Proxy class which makes it easier to Mock and use DI.
## Install
[![NuGet Badge](https://buildstats.info/nuget/ProxyInterfaceGenerator)](https://www.nuget.org/packages/ProxyInterfaceGenerator)
You can install from NuGet using the following command in the package manager window:
`Install-Package ProxyInterfaceGenerator`
Or via the Visual Studio NuGet package manager or if you use the `dotnet` command:
`dotnet add package ProxyInterfaceGenerator`
## Usage
### Given: an external existing class which does not implement an interface
``` c#
public sealed class Person
{
public string Name { get; set; }
}
```
## Create a partial interface
And annotate this with `ProxyInterfaceGenerator.Proxy` with the Type which needs to be wrapped:
``` c#
[ProxyInterfaceGenerator.Proxy(typeof(ProxyInterfaceConsumer.Person))]
public partial interface IPerson
{
}
```
## When the code is compiled, this source generator creates the following
### 1. An additional partial interface
Which defines the same properties and methods as in the external class.
``` c#
public partial interface IPerson
{
string Name { get; set; }
}
```
### 2. A Proxy class
Which takes the external class in the constructor and wraps all properties.
``` c#
public class PersonProxy
{
public Person _Instance { get; }
public PersonProxy(Person instance)
{
_Instance = instance;
}
public string Name { get => _Instance.Name; set => _Instance.Name = value; }
}
```
## Use it
``` c#
IPerson p = new PersonProxy(new Person());
p.Name = "test";
```
@@ -5,6 +5,29 @@
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>9</LangVersion>
<Nullable>enable</Nullable>
<Authors>Stef Heyenrath</Authors>
<Description></Description>
<Title>ProxyInterfaceGenerator</Title>
<PackageId>ProxyInterfaceGenerator</PackageId>
<Description>This project uses Source Generation to generate an interface and a Proxy class for classes. This makes it possible to wrap external classes which do not have an interface, in a Proxy class which makes it easier to Mock and use DI.</Description>
<PackageTags>class;Fluent;Builder;FluentBuilder;Model;DTO;SourceGenerator;Analyzer;Generation;Generate</PackageTags>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageReleaseNotes>See ReleaseNotes.md</PackageReleaseNotes>
<PackageProjectUrl>https://github.com/StefH/ProxyInterfaceGenerator</PackageProjectUrl>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/StefH/ProxyInterfaceGenerator</RepositoryUrl>
<TargetFramework>netstandard2.0</TargetFramework>
<ProjectGuid>{12344228-91F4-4502-9595-39584E5ABB34}</ProjectGuid>
<IncludeBuildOutput>false</IncludeBuildOutput>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)Generated</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
<ItemGroup>
@@ -16,4 +39,13 @@
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.10.0" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<None Remove="bin\Debug\netstandard2.0\\ProxyInterfaceGenerator.dll" />
<None Remove="bin\Release\netstandard2.0\\ProxyInterfaceGenerator.dll" />
</ItemGroup>
<ItemGroup>
<None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
</Project>