Getting Started with BuilderHacker
Installation
Step 1: Install NuGet Package
Choose based on your needs:
For source generation (recommended for .NET 6+):
dotnet add package SAProduction.BuilderHacker.Generator
For runtime builders (all frameworks):
dotnet add package SAProduction.BuilderHacker.Core
For both:
dotnet add package SAProduction.BuilderHacker.Generator
dotnet add package SAProduction.BuilderHacker.Core
Current Version: 1.1.0
Your First Builder
Option 1: Source Generator (Best Performance)
Step 1: Create your class
using BuilderHacker.Abstraction.Attributes;
[GenerateBuilderHacker]
public partial class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
}
Step 2: Use the generated builder
// Default (standalone) generated builder (default: Create())
var product = ProductBuilder.Create()
.Name("Laptop")
.Price(999.99m)
.Description("High-performance laptop")
.Build();
// Or, if you use the partial-mode flag: [GenerateBuilderHacker(true)]
// the generator generates a nested Builder() method on your type:
// [GenerateBuilderHacker(true)]
// public partial class Product { /* ... */ }
// Usage:
// var product = Product.Builder().Name(...).Price(...).Build();
That's it! The builder was generated at compile-time.
Option 2: Runtime Builder (Universal)
Step 1: No attribute needed
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
}
Step 2: Use EntityBuilder
using BuilderHacker.Core;
var product = EntityBuilder<Product>.Create()
.Set(p => p.Name, "Laptop")
.Set(p => p.Price, 999.99m)
.Set(p => p.Description, "High-performance laptop")
.Build();
Handling Complex Scenarios
Private Setters
[GenerateBuilderHacker]
public partial class User
{
public string Email { get; private set; } // Private setter
public User(string email)
{
Email = email;
}
}
// Builder still works!
// Default generated standalone builder usage:
var user = UserBuilder.Create()
.Email("user@example.com")
.Build();
// If you generated with partial-mode ([GenerateBuilderHacker(true)]),
// use `User.Builder()` instead:
// var user = User.Builder().Email("user@example.com").Build();
Inherited Properties
public abstract class Entity
{
public int Id { get; set; }
public DateTime CreatedAt { get; set; }
}
[GenerateBuilderHacker]
public partial class Article : Entity
{
public string Title { get; set; }
public string Content { get; set; }
}
// Builder includes inherited properties
// Default standalone mode:
var article = ArticleBuilder.Create()
.Id(1)
.CreatedAt(DateTime.Now)
.Title("My Article")
.Content("Article content")
.Build();
// Partial-mode usage (if you used [GenerateBuilderHacker(true)]):
// var article = Article.Builder()...Build();
Common Patterns
Builder with Default Values
[GenerateBuilderHacker]
public partial class Config
{
public string Environment { get; set; } = "Production";
public int Timeout { get; set; } = 30;
public bool Debug { get; set; } = false;
}
// Override defaults as needed
var config = ConfigBuilder.Create()
.Environment("Development")
.Debug(true)
.Build();
Partial Class Entry Point
[GenerateBuilderHacker(true)] // true = generate in partial class
public partial class Settings
{
public string ApiKey { get; set; }
public int MaxRetries { get; set; }
public static Settings CreateDefault() => Builder()
.ApiKey("key123")
.MaxRetries(3)
.Build();
}
Troubleshooting
Builder not generated?
- Ensure the class is marked
public - Ensure the class is marked
partial - Check that
[GenerateBuilderHacker]attribute is present - Rebuild the project (VS: Clean + Build)
Can't access private properties?
- BuilderHacker supports private setters and private fields
- Public getters are still required
- The builder will expose all members (even private ones)
Framework Compatibility
| Approach | .NET Framework | .NET Core | .NET 5 | .NET 6+ |
|---|---|---|---|---|
| Source Generator | ❌ | ❌ | ❌ | ✅ |
| EntityBuilder |
✅ | ✅ | ✅ | ✅ |
What's Next?
- Quick Reference - Common patterns at a glance
- Full Documentation - Deep dive into features
- Development Guidelines - Best practices
- Architecture - How it all works