A collection of usefull tools for web applications.
- Add the IT.Web.Common NuGet package to your ASP.NET Core 6 web project.
- Register the default services to the service collection
services.AddItWebCommonServices();
- That's it! Just use dependecy injection as you whould using the interfaces e.g.
var typeFinder = _host.Services.GetService<ITypeFinder>(); Type[] types = typeFinder.FindClassesOfType<MyClass>().ToArray();
-
You can just add the IT.Web.Common.Abstractions NuGet package to your ASP.NET Core 6 web project and create your own implementations of the
ITypeFinder
and theIWebAppFileProvider
. -
Register your implementations to the service collection. Even though the
TryAddSingleton<>()
method is used be sure to NOT callAddItWebCommonServices()
if you reference theIT.Web.Common
package, unless you know what you're doing.services.TryAddSingleton<IWebAppFileProvider, MyWebAppFileProvider>(); services.TryAddSingleton<ITypeFinder, MyTypeFinder>();
-
That's it! Just use dependecy injection as you whould using the interfaces e.g.
var typeFinder = _host.Services.GetService<ITypeFinder>(); Type[] types = typeFinder.FindClassesOfType<MyClass>().ToArray();
Backstory: I've been using pattern of configuring by services and startup in general for about three years now. Even before this bs. I also don't like humungous Startups (Before Net 6), if you do though you can check section 2.2.
Program.cs:
using IT.Web.Common.Extensions;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureApplicationServices(builder.Configuration);
builder.Host.ConfigureHostBuilder();
WebApplication app = builder.Build();
app.ConfigureRequestPipeline();
app.Run();
LoggingStartup:
using IT.Web.Common.Abstractions;
using JetBrains.Annotations;
using Serilog;
[UsedImplicitly]
public class LoggingStartup : IAppStartup
{
public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
}
public void ConfigureHostBuilder(IHostBuilder hostBuilder) =>
hostBuilder.UseSerilog((webHostBuilderContext, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(webHostBuilderContext.Configuration));
public void Configure(IApplicationBuilder application) => application.UseSerilogRequestLogging();
public int Order => 500;
}
Example when a route builder is needed:
using IT.Web.Common.Abstractions;
using JetBrains.Annotations;
namespace InNode.Invoicing.Host.WebApi.Startups;
[UsedImplicitly]
public class ControllersStartup : IAppStartup
{
public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
services.AddControllers();
}
public void ConfigureHostBuilder(IHostBuilder hostBuilder)
{
}
public void Configure(IApplicationBuilder application)
{
if (application is not IEndpointRouteBuilder routeBuilder) // Till ms fixes their abstaction bs
return;
routeBuilder.MapControllers();
}
public int Order => 1000; // Endpoints should be loaded last
}
Use the same Program.cs as before but create only one startup
Program.cs:
using IT.Web.Common.Extensions;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureApplicationServices(builder.Configuration);
builder.Host.ConfigureHostBuilder();
WebApplication app = builder.Build();
app.ConfigureRequestPipeline();
app.Run();
using IT.Web.Common.Abstractions;
using JetBrains.Annotations;
namespace InNode.Invoicing.Host.WebApi.Startups;
[UsedImplicitly]
public class ApplicationStartup : IAppStartup
{
public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
services.AddControllers();
}
public void ConfigureHostBuilder(IHostBuilder hostBuilder) =>
hostBuilder.UseSerilog((webHostBuilderContext, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(webHostBuilderContext.Configuration));
public void Configure(IApplicationBuilder application)
{
application.UseExceptionHandler(webHostEnvironment.IsDevelopment() ? "/error-local-development" : "/error");
if (application is not IEndpointRouteBuilder routeBuilder) // Till ms fixes their abstaction bs
{
routeBuilder.MapControllers();
}
application.UseSerilogRequestLogging();
}
public int Order => 0; // There is only one startup so this is irrelevant
}