
This article was written in 2021. Versions, tools and recommendations may have changed since then. Newer posts are collected under .NET.
A plugin-like mechanism is already built into ASP.NET Core and is called Parts or Application Parts .
In principle, it is a discovery mechanism to be able to use Razor or MVC components such as controllers from other assemblies, for example. Therefore, Application Parts are also particularly well suited for Domain Driven Design (DDD) separation of application components in ASP.NET Core. A DDD abstraction is the most used way of these Application Parts in my applications and architectures.
The DDD Logic Assembly
As in an otherwise clean separation of responsibilities, we keep the logic in an extra project that becomes an extra assembly.
This assembly has no information that ASP.NET Core is the runtime!
The ASP.NET Core Part Assembly
The Part Assembly is an extra project that gets a reference to ASP.NET Core.
1<Project Sdk="Microsoft.NET.Sdk">
2
3
4 <ItemGroup>
5 <FrameworkReference Include="Microsoft.AspNetCore.App" />
6 </ItemGroup>In this project (e.g. MyCompany.MySuite.MyFeature) we can now create our controllers.
1// MyCompany.MySuite.MyFeature.AspNetCore
2
3public class PartPingController : Controller
4{
5 [HttpGet]
6 [Route("mypart/ping"]
7 public IActionResult Ping()
8 {
9 return Ok(DateTimeOffset.UtcNow);
10 }The Registration
The registration of the application part must now be done within the configuration of the application, namely within the MVC configuration.
Thereby the MvcBuilder is created. The assemblies in which it is to search for parts, must now be made known to it.
1// MyCompany.MySuite.MyWebApp
2public void ConfigureServices(IServiceCollection services)
3{
4 // register mvc controller
5 IMvcBuilder mvcBuilder = services.AddControllers()
6
7 // register application parts
8 mvcBuilder.AddApplicationPart(typeof(PartPingController).Assembly);
9}Done. That’s how easy it is to use Application Parts in ASP.NET Core to keep the hosting project itself lean and use Parts for plugins and routing separation.
Related articles

- 16 min read
Production Rate Limiting in ASP.NET Core
Most ASP.NET Core rate-limiting examples stop after registering a fixed window. That is enough to demonstrate the middleware, but it is not …

- 11 min read
The Big Decimal Bugfix with .NET 11
For more than two decades, (decimal)1.23 returned 1.23m. It looked correct, it passed every test and it was a polite lie.

- 10 min read
Distroless, Chiseled or Alpine: Choosing a .NET Base Image
Distroless, Chiseled and Alpine are often compared as three equivalent Linux distributions. They are not. Alpine is a distribution built …
Let's Work Together
Looking for an experienced Platform Architect or Engineer for your next project? Whether it's cloud migration, platform modernization or building new solutions from scratch - I'm here to help you succeed.
