DEV Community

Ricardo
Ricardo

Posted on • Originally published at rmauro.dev on

Adding Startup.cs back to .NET 6 Project

When NET 6 was released, the first big change was the lack of Startup.cs. This is very nice and all. But sometimes we just want it back, and here is how.

First, create a new file called Startup.cs at the root of your project with the following content - don't forget the namespace.

public class Startup
{
    readonly IConfiguration configuration;

    public Startup(IConfiguration configuration)
    {
        this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapDefaultControllerRoute();
        });
    }
}
Enter fullscreen mode Exit fullscreen mode

Then at Program.cs change to the following.

//add necessary usings

var builder = WebApplication.CreateBuilder(args);

//create new instance of Startup
var startup = new Startup(builder.Configuration);

//configure all services
startup.ConfigureServices(builder.Services);

var app = builder.Build();

//configure the pipeline
startup.Configure(app, builder.Environment);

//run
app.Run();
Enter fullscreen mode Exit fullscreen mode

The simplest solution is the better!

That is it. Enjoy.

Top comments (7)

Collapse
 
pbouillon profile image
Pierre Bouillon

The Program.cs seems to be missed by many developers!

I happened to look at the preview of .NET 7 and you should be pretty happy since it introduce back the Program.cs for those who want it. All you will need to do is appending --use-program-main to your command line:

console

This will also be supported directly by Visual Studio (I just find odd that a checkbox is for not enabling something):

vs

Hope it might save @stphnwlsh the extension method and give an alternative to @kaylumah!

Collapse
 
rmaurodev profile image
Ricardo

Super cool

Collapse
 
stphnwlsh profile image
Stephen Walsh

Hey that's pretty cool, but honestly I don't mind the new setup. I just don't want everything in the one file. It's maybe cool for small projects or little things but when you're configuring logging, telemetry, swagger etc that Program.cs blows out quickly.

I can easily create extension methods on the WebApplicationBuilder and WebApplication in say a ProgramExtensions.cs file and I find it helps with that separation, just like Startup.cs did.

Also not a huge fan of the minimal api setup, but if when implementing those, I'd use extension methods to separate out pseudo controllers too

Collapse
 
pbouillon profile image
Pierre Bouillon

I have to admit that you are right, the Program.cs does look like a good idea but the fact that it is blowing up when configuring a bigger application might show that it may not be the best way to reduce the boilerplate

As for minimal API it seems that a lot of people are doing the same. Still in .NET 7, they introduces RouteGroups to create such pseudo-controllers and keep it a little bit more coherent

However, I think that it may not be ideal if you are defining endpoints in a single pseudo-controller and they all have specific configuration as for their routes / authorization / metadata / etc.

Collapse
 
karanveersp profile image
Karanveer Singh

I think people will still use the Startup and Program classes for a while because most of the books on ASP.NET still have them as examples.
Thanks for making this reference available!

Collapse
 
kaylumah profile image
Max Hamulyák

I am still not sure what I think of the change they made to the template. Sure it's nice to write less code, and I supose its more beginner friendly. But in my opinion its also less verbose.

Collapse
 
stphnwlsh profile image
Stephen Walsh

I've just build into the new format with extension methods. Have to fix the naming but works for me.

public static WebApplicationBuilder ConfigureBuilder(this WebApplicationBuilder builder)
Enter fullscreen mode Exit fullscreen mode