Skip to content
ASP.NET Boilerplate
Create your project →
v10.5Released July 2026 — what's new → Open source · MIT · Since 2013

Skip the plumbing.
Ship the business logic.

ASP.NET Boilerplate is an open-source application framework for ASP.NET Core. Layered DDD architecture, a module system and multi-tenancy come built in; authorization, validation, transactions and audit logs happen by convention. MIT licensed, in production since 2013.

ProductAppService.csC#
public class ProductAppService
: AsyncCrudAppService<Product, ProductDto>
{
public ProductAppService(IRepository<Product> repository)
: base(repository)
{
CreatePermissionName = "Products.Create";
}
}
// That's the whole service. You get:
// GET, POST, PUT, DELETE /api/services/app/Product/*
// paging, sorting, validation, UoW and audit logs
01 — Conventions

Write business code, not plumbing.

The same use case, written twice. On the right, ASP.NET Boilerplate handles the cross-cutting work by convention. The numbers show where each piece comes from.

Plain ASP.NET Core

40 lines
public class ProductService : IProductService
{
private readonly AppDbContext _db;
private readonly IAuthorizationService _auth;
private readonly IHttpContextAccessor _http;
private readonly IAuditWriter _audit;
private readonly ILogger<ProductService> _logger;
// constructor with five injected dependencies...
public async Task CreateAsync(CreateProductInput input)
{
var user = _http.HttpContext!.User;
var auth = await _auth.AuthorizeAsync(user, "Products.Create");
if (!auth.Succeeded) throw new ForbiddenException();
var errors = new List<ValidationResult>();
var ctx = new ValidationContext(input);
if (!Validator.TryValidateObject(input, ctx, errors, true))
throw new InputValidationException(errors);
await using var tx = await _db.Database.BeginTransactionAsync();
try
{
_db.Products.Add(new Product(input.Name, input.Price));
await _db.SaveChangesAsync();
await _audit.WriteAsync(user, nameof(CreateAsync), input);
await tx.CommitAsync();
}
catch (Exception ex)
{
await tx.RollbackAsync();
_logger.LogError(ex, "Creating product failed");
throw new ApiException(ex);
}
}
}
// Program.cs
builder.Services.AddScoped<IProductService, ProductService>();

With ASP.NET Boilerplate

17 lines
public class ProductAppService
4 5 6: ApplicationService, IProductAppService
{
private readonly IRepository<Product> _products;
public ProductAppService(IRepository<Product> products)
{
_products = products;
}
1[AbpAuthorize("Products.Create")]
2 3public async Task CreateAsync(CreateProductInput input)
{
var product = new Product(input.Name, input.Price);
await _products.InsertAsync(product);
}
}
  1. 1Authorization. [AbpAuthorize] checks the permission before the method runs.
  2. 2Validation. CreateProductInput is validated from its data annotations.
  3. 3Unit of work. The method is one transaction: it commits or rolls back.
  4. 4Audit log. Caller, method, parameters and duration are recorded.
  5. 5Exception handling. Errors become consistent, user-friendly API responses.
  6. 6Dependency injection. Application services are registered by convention.
How application services work →
02 — Capabilities

The parts every business app needs, already solved.

2.1

Layered DDD architecture

Entities, repositories, domain and application services with clear boundaries from the first commit.

Docs →
2.2

Module system

Split features into modules with their own dependencies, configuration and lifecycle.

Docs →
2.3

Multi-tenancy, database to UI

Tenant isolation in data filters, settings and the UI — one shared database or one per tenant.

Docs →
2.4

Authorization & permissions

Define a permission once, then check it on methods, APIs and in the UI.

Docs →
2.5

Localization & settings

Multi-language apps, plus settings at application, tenant and user level.

Docs →
2.6

Background jobs & real-time

A persistent job queue, background workers and SignalR notifications to connected users.

Docs →
03 — Startup templates

Start from a working app, not an empty folder.

Login, users, roles and tenants are already wired up. Free, and yours to change.

localhost:4200/app/home
AAngular SPAAngular front end on an ASP.NET Core Web API, with login, tenant, user and role management.
localhost:62114/Users
BASP.NET Core MVC + jQueryServer-rendered Razor pages on the same back end. One project, one deployment.
  • Login, registration & tenant switch
  • User, role & tenant management
  • Permission checks in UI and API
  • Swagger UI and test projects
04 — ASP.NET Zero

Need a production-ready starting point?

ASP.NET Zero is our commercial solution, built on ASP.NET Boilerplate. It adds the screens, integrations and tooling most SaaS and line-of-business apps end up building anyway, so your team starts on features.

Free startup template compared with ASP.NET Zero
Feature Free template ASP.NET Zero
.NET version .NET 9 Latest .NET
User, role & permission management UI Basic Included
Tenant management & editions Tenants only Included
Subscriptions & payment (Stripe, PayPal) Not included Included
UI themes 1 default 12+ themes
RAD code generator (Power Tools) Not included Included
Audit log UI Not included Included
Organization units API only Included
Chat & real-time notifications Not included Included
LDAP & social logins Not included Included
Premium support Community Included
…and many more features See all ↗
ASP.NET Zero dashboard with statistics, sales summary and regional stats
Fig. 1 Dashboard. Income, tenants and editions at a glance.
ASP.NET Zero users page with a searchable user table
Fig. 2 Users & permissions. Searchable user list with roles and Excel operations.
ASP.NET Zero languages page listing enabled UI languages
Fig. 3 Languages. Manage UI languages and texts at runtime.
ASP.NET Zero dashboard in a top-menu theme
Fig. 4 Themes. Switch layouts and themes per tenant or user.