Author : MD TAREQ HASSAN
Overview
- Startup class contains configuration/initialization code in the form of the 
ConfigureServices()andConfigure()methodsConfigureServices(): register services that are required by the app & consumed across the app via dependency injection (DI)Configure(): creates the app’s request processing pipeline
 - The Startup class is specified when the app’s host is built by 
UseStartup()extension method of theIWebHostBuilderinProgram.cs - Named 
Startupby convention - The host provides services that are available to the Startup class constructor
 - A common use of dependency injection into the Startup class is to inject:
    
HostingEnvironmentto configure services by environmentIConfigurationto read configurationILoggerFactoryto create a logger inStartup.ConfigureServices()
 - Links:
 
Startup.cs
public class Startup
{
    // Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        //... ... ...
    }
    // Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        //... ... ...
    }
}
ConfigureServices
- Optional method
 - Called by the host before the Configure method to configure the app’s services
 - To use any service in the app, call 
Add{Service}extension methods onIServiceCollection(AddDbContext,AddDefaultIdentity,AddEntityFrameworkStores,AddRazorPages) - Adding services to the service container makes them available within the app and in the Configure method (The services are resolved via dependency injection or from ApplicationServices)
 
public class Startup
{
    public IConfiguration Configuration { get; }
	
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true).AddEntityFrameworkStores<ApplicationDbContext>();
        services.AddRazorPages();
		
        //... ... ...
    }
	
    public void Configure(IApplicationBuilder app)
    {
        //... ... ...
    }
}
Configure
- Request handling pipeline / middleware pipeline is configured here
    
Use{Service}(): adds one or more middleware components to the request pipelineRun{Service}(): add terminal middleware- Each middleware component in the request pipeline is responsible for invoking the next component in the pipeline or short-circuiting the chain, if appropriate
 
 - The request pipeline is configured by adding middleware components to an 
IApplicationBuilderinstance - Hosting creates an 
IApplicationBuilderand passes it directly to Configure - Additional services, such as IWebHostEnvironment, ILoggerFactory, or anything defined in ConfigureServices, can be specified in the Configure method signature. These services are injected if they’re available
 
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        //... ... ...
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}
Multiple Startup
- When the app defines separate Startup classes for different environments (for example, StartupDevelopment), the appropriate Startup class is selected at runtime
 - The class whose name suffix matches the current environment is prioritized
 - If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. For more information
 
See: