Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/CodingFlow/decorator-generator
Source generator for decorator pattern boilerplate code in C#.
https://github.com/CodingFlow/decorator-generator
csharp csharp-sourcegenerator roslyn source-generator source-generators
Last synced: about 1 month ago
JSON representation
Source generator for decorator pattern boilerplate code in C#.
- Host: GitHub
- URL: https://github.com/CodingFlow/decorator-generator
- Owner: CodingFlow
- License: apache-2.0
- Created: 2023-02-19T03:21:07.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-07-29T15:17:45.000Z (5 months ago)
- Last Synced: 2024-08-01T22:43:53.127Z (4 months ago)
- Topics: csharp, csharp-sourcegenerator, roslyn, source-generator, source-generators
- Language: C#
- Homepage:
- Size: 1.58 MB
- Stars: 9
- Watchers: 1
- Forks: 5
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- RSCG_Examples - decorator-generator - generator (Do not want to test 112 ( old ISourceGenerator ) / 1. [ThisAssembly](https://ignatandrei.github.io/RSCG_Examples/v2/docs/ThisAssembly) , in the [EnhancementProject](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#enhancementproject) category)
README
# Decorator Generator
[![Nuget](https://img.shields.io/nuget/v/DecoratorGenerator)](https://www.nuget.org/packages/DecoratorGenerator)
![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/CodingFlow/decorator-generator/pull-request.yml)
[![Nuget](https://img.shields.io/nuget/dt/DecoratorGenerator)](https://www.nuget.org/packages/DecoratorGenerator)
[![GitHub Sponsors](https://img.shields.io/github/sponsors/CodingFlow)](https://github.com/sponsors/CodingFlow)Source generator for decorator pattern boilerplate code in C#.
When implementing the [decorator pattern in C#](https://en.wikipedia.org/wiki/Decorator_pattern#C#), it requires adding boilerplate code for every interface that needs to support decorators, namely the abstract class. Boilerplate is tedious to write and error-prone. This source generator solves this problem by automatically generating the abstract class. It only needs to be told which interfaces it should generate the abstract class for.
![decorator-pattern-uml](https://user-images.githubusercontent.com/3643313/220009438-a2ef1990-af1e-4b56-a5c9-b3f1aed2d80f.png)
# Getting Started
## Installation
Add the library via NuGet to the project(s) that you want to auto-generate abstract decorator classes for:
- Either via Project > Manage NuGet Packages... / Browse / search for decorator-generator / Install
- Or by running a command in the Package Manager Console```c#
Install-Package DecoratorGenerator
```## Usage
Add a `Decorate` attribute to the interface:
```c#
using DecoratorGenerator;namespace SampleLibrary;
[Decorate]
public interface ICat
{
string Meow();
}
```Build the project so the abstract class is generated for the interface. The generated class will be named after the interface, but without the `I` prefix. In this case, since the interface is `ICat` the class will be `CatDecorator`. Then create your decorator class as usual:
```c#
namespace SampleLibrary;public class BarkingCat : CatDecorator
{
public BarkingCat(ICat cat) : base(cat)
{}
public override string Meow()
{
return $"woof woof - {base.Meow()}";
}
}```
Example usage of the decorator:
```c#
using SampleLibrary;namespace SampleApp;
partial class Program
{static void Main(string[] args)
{
var cat = new BarkingCat(new Cat());
var sound = cat.Meow();Console.WriteLine(sound);
}}
```# Configuration
## List of Target Interfaces in a Config file
To generate decorator abstract classes for third party interfaces, Decorator Generator will look for a struct named `WrapperList` and generate classes of the types in the fields of the `WrapperList`:
```c#
using Amazon.DynamoDBv2.DataModel;public struct WrapperList
{
// name the field whatever you want, the name isn't used, only the type is used.
IDynamoDBContext dynamoDBContext;
}
```In this case, it will generate a class for `IDynamoDBContext` called `DynamoDBContextDecorator`. This feature will also work for your own interfaces if you prefer this approach instead of using the attribute.