Skip to content

Concept overriding

David Yates edited this page Jul 31, 2020 · 5 revisions

You can override any of the built in classes that are being registered in the ConsoleMenu.cs RegisterInternalDependencies method. Currently, it looks like this:

/// <summary>Register internal dependencies</summary>
/// <param name="collection">Service collection</param>
private void RegisterInternalDependencies(IServiceCollection collection)
{
   collection.AddSingleton<IConsoleMenuRepository, ConsoleMenuRepository>();
   collection.AddSingleton<IConsoleMenuController, ConsoleMenuController>();
   

   collection.AddTransient<IExitConsoleMenuItem, ExitConsoleMenuItem>();
   collection.AddTransient<IConsoleCommand, ConsoleCommand>();
   collection.AddSingleton<IPromptHelper, PromptHelper>();
}

In your console program, you just have to do the following (see last line):

static void AddMyDependencies(IServiceCollection serviceCollection)
{
   // IConfiguration requires: Microsoft.Extensions.Configuration NuGet package
   // AddJsonFile requires:    Microsoft.Extensions.Configuration.Json NuGet package
   // https://stackoverflow.com/a/46437144/97803
   var builder = new ConfigurationBuilder()
		.SetBasePath(Directory.GetCurrentDirectory())
		.AddJsonFile("appsettings.json");

   IConfiguration config = builder.Build();

   serviceCollection.AddSingleton<IConfiguration>(config);
   serviceCollection.AddTransient<IAustinPowersMenuItem, AustinPowersMenuItem>();

   // Overriding a built in component
   serviceCollection.AddTransient<IExitConsoleMenuItem,ExitConsoleOverrideMenuItem>();
}

This works because I first register the dependencies of the ConsoleMenuHelper and then I you call AddMenuItemViaReflection on the ConsoleMenu object to register your dependencies; thus, overwriting what I setup.

   var menu = new ConsoleMenu();

   menu.AddDependencies(AddMyDependencies);
   menu.AddMenuItemViaReflection(Assembly.GetExecutingAssembly()); 

   await menu.DisplayMenuAsync("Hello1", "Main");
Clone this wiki locally