← Back to articles

.Net Core Console Application IoC

MVC gets IoC boilerplate generated for free; console apps don't. With HostBuilder from the Generic Host it's easy to wire up the same dependency injection, config and logging in a console application — here is the boilerplate.

Tedd

The default setup for .Net Core MVC application is to use IoC. You get a Startup.cs file created that contains boilerplate code for IoC.

If you want to use the builtin IoC with .Net Core you have to write it yourself. Luckily the HostBuilder makes this easy. HostBuilder is provided by the Generic Host introduced in .Net Core 2.1.

You need to add nuget packages:

  • Install-Package Microsoft.Extensions.Hosting
  • Install-Package Microsoft.Extensions.DependencyInjection
  • Install-Package Microsoft.Extensions.Configuration
  • Install-Package Microsoft.Extensions.Configuration.Json
  • Install-Package Microsoft.Extensions.Configuration.CommandLine
  • Install-Package Microsoft.Extensions.Logging
  • Install-Package Microsoft.Extensions.Logging.Console

Main.cs

using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;

public static class Main
{
 public static async Task Main()
 {
 var builder = new Microsoft.Extensions.Hosting.HostBuilder()
 .ConfigureHostConfiguration(Startup.ConfigureHostConfiguration)
 .ConfigureAppConfiguration(Startup.ConfigureAppConfiguration)
 .ConfigureLogging(Startup.ConfigureLogging)
 .ConfigureServices(Startup.ConfigureServices);

 await builder.RunConsoleAsync();
 }
} 

Startup.cs

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.IO;

internal static class Startup
{
 internal static void ConfigureHostConfiguration(IConfigurationBuilder config)
 {

 }

 internal static void ConfigureAppConfiguration(HostBuilderContext hostingContext, IConfigurationBuilder config)
 {
 config.SetBasePath(Directory.GetCurrentDirectory());
 config.AddJsonFile("appsettings.json", true);
 // Optional: Add command line arguments as config
 var args = Environment.GetCommandLineArgs();
 if (args != null) config.AddCommandLine(args);
 }
 internal static void ConfigureLogging(HostBuilderContext hostingContext, ILoggingBuilder loggingBuilder)
 {
 loggingBuilder.AddConfiguration(hostingContext.Configuration);
 }

 internal static void ConfigureServices(HostBuilderContext hostingContext, IServiceCollection services)
 {
 // https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.hostoptions?view=aspnetcore-2.2
 /*services.Configure<HostOptions>(option =>
 {
 option.ShutdownTimeout = TimeSpan.FromSeconds(20);
 });*/
 }
} 

Config example

{
 "Logging": {
 "IncludeScopes": false,
 "LogLevel": {
 "Default": "Information",
 "System": "Warning",
 "Microsoft": "Information"
 },
 "Console": {
 "LogLevel": {
 "Default": "Warning",
 "System": "Information",
 "Microsoft": "Information"
 }
 }
 }
} 

Written by Tedd · Oslo, Norway

Updated 19 Jun 2019

Follow the journal via RSS