Template Basics
A template consists of three main components:- Template Class: Contains the generation logic
- Template Partial Class: Your customizations and business logic
- Template Registration: Defines when and how templates are instantiated
Creating a Basic Template
- Name:
EntityTemplate - Templating Method:
C# String Interpolation - File Extension:
cs
- Model Type: Select your API model (e.g.,
Class)
Templates/EntityTemplate/EntityTemplateTemplate.cs (generated)Templates/EntityTemplate/EntityTemplateTemplatePartial.cs (yours)Templates/EntityTemplate/EntityTemplateTemplateRegistration.cs (generated)using Intent.Engine;
using Intent.Modules.Common.CSharp.Builder;
using Intent.Modules.Common.CSharp.Templates;
using Intent.Templates;
using MyModule.Api;
namespace MyModule.Templates.EntityTemplate
{
partial class EntityTemplateTemplate : CSharpTemplateBase<ClassModel>
{
public const string TemplateId = "MyModule.EntityTemplate";
public EntityTemplateTemplate(
IOutputTarget outputTarget,
ClassModel model)
: base(TemplateId, outputTarget, model)
{
}
protected override CSharpFileConfig DefineFileConfig()
{
return new CSharpFileConfig(
className: $"{Model.Name}",
@namespace: $"{OutputTarget.GetNamespace()}.Domain.Entities",
relativeLocation: $"{OutputTarget.GetNamespace()}/Domain/Entities");
}
public override string TransformText()
{
return $@"
using System;
namespace {Namespace}
{{
public class {ClassName}
{{
{GenerateProperties()}
}}
}}";
}
private string GenerateProperties()
{
return string.Join("\n ",
Model.Properties.Select(prop =>
$"public {GetTypeName(prop.Type)} {prop.Name} {{ get; set; }}"));
}
}
}
Template Types
C# String Interpolation (Recommended)
Modern approach using C# string interpolation:- Basic Example
- With Builder Pattern
- Multi-File Output
T4 Templates (Legacy)
Text Template Transformation Toolkit approach:EntityTemplate.tt
Custom File Templates
For non-C# files (JSON, YAML, XML, etc.):ConfigTemplate.cs
Template Registration Patterns
File Per Model Registration
Generates one file for each model element:Single File Registration
One file per output target:Single File List Model Registration
One file processing multiple models:Custom Registration
Full control over instantiation:Using the CSharp Builder
The CSharp Builder provides a fluent API for generating C# code:Building Classes
Building Interfaces
Building Methods with Complex Logic
Template Dependencies
Templates can depend on other templates:Accessing Metadata
Via Template Model
Via Metadata Manager
Via Application Settings
Template Output Configuration
File Location and Naming
Multiple Output Files
Code Management Attributes
IntentManaged Attributes
Control how code is managed:- Fully: Completely managed, regenerated each time
- Merge: Body can be customized, signature regenerated
- Ignore: Not managed, won’t be touched
Best Practices
Keep Templates Focused
Extract Complex Logic
Use Consistent Naming
Cache Expensive Operations
Testing Templates
Unit Testing
Integration Testing
Create test applications with sample metadata and verify output.Troubleshooting
Template not generating files
Template not generating files
- Verify
GetModels()returns elements in registration - Check template is enabled in module settings
- Ensure output target is configured
- Review Software Factory output for errors
Generated code has compile errors
Generated code has compile errors
- Check all using statements are included
- Verify type names are correctly resolved
- Ensure proper escaping of special characters
- Test with various metadata configurations
Template changes not reflected
Template changes not reflected
- Rebuild the module project
- Clear Intent Architect cache
- Reinstall module in test application
- Check template version in .imodspec
Next Steps
Creating Decorators
Learn to modify template outputs with decorators
Factory Extensions
Hook into Software Factory lifecycle
Testing Modules
Strategies for testing your modules
Designer Configuration
Create custom visual designers