pauldeen79.ClassFramework.TemplateFramework 0.18.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package pauldeen79.ClassFramework.TemplateFramework --version 0.18.0                
NuGet\Install-Package pauldeen79.ClassFramework.TemplateFramework -Version 0.18.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="pauldeen79.ClassFramework.TemplateFramework" Version="0.18.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add pauldeen79.ClassFramework.TemplateFramework --version 0.18.0                
#r "nuget: pauldeen79.ClassFramework.TemplateFramework, 0.18.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install pauldeen79.ClassFramework.TemplateFramework as a Cake Addin
#addin nuget:?package=pauldeen79.ClassFramework.TemplateFramework&version=0.18.0

// Install pauldeen79.ClassFramework.TemplateFramework as a Cake Tool
#tool nuget:?package=pauldeen79.ClassFramework.TemplateFramework&version=0.18.0                

ClassFramework

Class modeling framework for C#

If you want to create a C# class structure based on a model, this framework is for you!

We are using the following dependencies:

  • CsharpExpressionDumper, to generate c# code for values
  • CrossCutting.ProcessingPipeline, for extendable pipelines for transformation of classes and interfaces
  • CrossCutting.Utilities.Parsers, for parsing named format strings like {$property.Name}Builder
  • TemplateFramework, to translate the domain model to actual c# code files

The Domain and Pipelines packages target .NET Standard 2.0, so you can use it anywhere. Because of the dependency to TemplateFramework, we target some projects to .NET 8.0.

Background

Imagine you want to create some domain model for a new project.

First, you need to create a console project named [YourProjectName].CodeGeneration.

In this project, there are a number of components:

  • The Program.cs class, which runs the code generation
  • The Models folder, which contains interfaces for all your domain entities
  • The CodeGenerationProviders folder, which contains all types of code generators, like entities, builders and maybe abstractions

Philosophy

The entity and builder generators use the following characteristics:

  • The entity can be either a POCO or a DDD-style object, which takes all input in the constructor and then validates the state
  • You can use either immutable or mutable entities, and you can choose to make the setters private or public
  • You can use observable properties on entities, if you need to
  • For immutable entities, you can also generate builders. These are mutable, and you can easily convert between the two types (unless you want the entities in a separate project, without a reference to the builders)
  • Validation is supported using the IValidatableObject interface (standard .NET validation), and can be shared between the entities and the builders
  • Default values on the model properties can automatically be set in the constructor of the builders, if you want to
  • You can either create entities without interfaces, or interface-based entities (possibly in a different namespace, e.g. MyProject.Core and MyProject.Abstractions)

Dog fooding

I have decided that the models for ClassFramework need to be generated using ClassFramework. To make this possible, I have first generated everything with another framework (called ModelFramework) as a Bootstrap action. After this, I re-generated everything using ClassFramework.

But since version 0.9.1, I stored the generated code, so I could add breaking changes. This means the code generation in the build pipelines has been removed.

Known issues

If you have types with nested or multiple generic arguments, the nullability of those types will not get determined correctly... Try to fix this by creating types for this. E.g. System.Func<System.Object, System.Int32, System.Object?> Just create a delegate for this, and add this to the type mapping.

If you still get errors, you could use the CsharpTypeNameAttribute to decorate your property/field/parameter.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on pauldeen79.ClassFramework.TemplateFramework:

Package Downloads
DatabaseFramework.CodeGeneration

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.18.4 56 12/18/2024
0.18.3 39 12/18/2024
0.18.2 47 12/18/2024
0.18.1 45 12/18/2024
0.18.0 60 12/17/2024
0.17.0 186 11/17/2024
0.16.2 162 11/10/2024
0.16.1 112 11/6/2024
0.16.0 85 11/6/2024
0.15.5 110 10/31/2024
0.15.4 113 10/30/2024
0.15.3 146 10/18/2024
0.15.2 113 10/17/2024
0.15.1 111 9/22/2024
0.15.0 137 9/21/2024
0.14.2 164 9/11/2024
0.14.1 218 8/20/2024
0.14.0 125 8/19/2024
0.13.9 97 8/3/2024
0.13.8 96 7/28/2024
0.13.7 185 7/6/2024
0.13.6 180 6/9/2024
0.13.5 104 6/9/2024
0.13.4 120 6/9/2024
0.13.3 221 5/25/2024
0.13.2 255 5/20/2024
0.13.1 207 5/18/2024
0.13.0 162 5/17/2024
0.12.7 303 5/9/2024
0.12.6 83 5/9/2024
0.12.5 164 5/8/2024
0.12.4 161 5/7/2024
0.12.3 112 5/7/2024
0.12.2 68 5/3/2024
0.12.1 104 5/2/2024
0.12.0 89 5/1/2024
0.11.0 178 4/19/2024
0.10.0 144 4/16/2024
0.9.3 166 4/12/2024
0.9.2 129 4/9/2024
0.9.1 121 4/7/2024
0.9.0 159 4/6/2024
0.8.9 111 4/5/2024
0.8.8 116 4/5/2024
0.8.7 118 4/5/2024
0.8.6 129 4/4/2024
0.8.5 115 4/3/2024
0.8.4 131 4/3/2024
0.8.3 109 4/3/2024
0.8.1 120 4/2/2024
0.8.0 223 3/23/2024
0.7.2 147 3/22/2024
0.7.1 126 3/22/2024
0.7.0 153 3/20/2024
0.6.0 206 3/17/2024
0.5.6 191 3/15/2024
0.5.5 131 3/15/2024
0.5.4 138 3/14/2024
0.5.3 139 3/14/2024
0.5.2 116 3/14/2024
0.5.1 150 3/13/2024
0.4.2 259 3/8/2024
0.4.1 104 3/8/2024
0.4.0 118 3/8/2024
0.3.1 203 3/5/2024
0.3.0 99 3/5/2024
0.2.0 164 3/4/2024
0.1.0 319 2/25/2024