Category: Learning the building blocks

Summary – Options, Settings, and Configuration

This chapter explored the Options pattern, a powerful tool allowing us to configure our ASP.NET Core applications. It enables us to change the application without altering the code. The capability even allows the application to reload the options at runtime when a configuration file is updated without downtime. We learned to load settings from multiple […]

Workaround – Injecting options directly – Options, Settings, and Configuration

The only negative point about the .NET Options pattern is that we must tie our code to the framework’s interfaces. We must inject an interface like IOptionsMonitor<Options> instead of the Options class itself. By letting the consumers choose the interface, we let them control the lifetime of the options, which breaks the inversion of control, […]

Project – OptionsValidationFluentValidation – Options, Settings, and Configuration

In this project, we validate options classes using FluentValidation. FluentValidation is a popular open-source library that provides a validation framework different from data annotations. We explore FluentValidation more in Chapter 15, Getting Started with Vertical Slice Architecture, but that should not hinder you from following this example.Here, I want to show you how to leverage […]

Validation types – Options, Settings, and Configuration

To implement options validation types or options validators, we can create a class that implements one or more IValidateOptions<TOptions> interfaces. One type can validate multiple options, and multiple types can validate the same options, so the possible combinations should cover all use cases.Using a custom class is no harder than using data annotations. However, it […]

Eager validation – Options, Settings, and Configuration

Eager validation has been added to .NET 6 and allows catching incorrectly configured options at startup time in a fail-fast mindset.The Microsoft.Extensions.Hosting assembly adds the ValidateOnStart extension method to the OptionsBuilder<TOptions> type.There are different ways of using this, including the following, which binds a configuration section to an options class: services.AddOptions<Options>()    .Configure(o => /* Omitted […]

Exploring other configuration possibilities – Options, Settings, and Configuration

We can mix those configuration classes with extension methods. For example: Here, we use the PostConfigure method to demonstrate that. Let’s add the following two lines of code (highlighted): const string NamedInstance = “MyNamedInstance”;var builder = WebApplication.CreateBuilder(args);builder.Services.PostConfigure<ConfigureMeOptions>(    NamedInstance,    x => x.Lines = x.Lines.Append(“Inline PostConfigure Before”));builder.Services    .AddSingleton<IPostConfigureOptions<ConfigureMeOptions>, ConfigureAllConfigureMeOptions>()    .Configure<ConfigureMeOptions>(builder.Configuration        .GetSection(“configureMe”))    .Configure<ConfigureMeOptions>(NamedInstance, builder.Configuration        .GetSection(“configureMe”))    .AddSingleton<IConfigureOptions<ConfigureMeOptions>, ConfigureAllConfigureMeOptions>()    //.AddSingleton<IConfigureNamedOptions<ConfigureMeOptions>, […]

Named options – Options, Settings, and Configuration

Now, let’s explore named options by configuring two more instances of the MyOptions class. The concept is to associate a configuration of the options with a name. Once that is done, we can request the configuration we need. Unfortunately, the ways we explore named options and most online examples break the Inversion of Control principle. […]

Using the settings file – Options, Settings, and Configuration

Loading configurations from a file is often more convenient than hardcoding the values in C#. Moreover, the mechanism allows overriding the configurations using different sources, bringing even more advantages.To load MyOptions from the appsettings.json file, we must first get the configuration section, then configure the options, like the following: var defaultOptionsSection = builder.Configuration    .GetSection(“defaultOptions”);builder.Services    .Configure<MyOptions>(defaultOptionsSection); […]

Learning the building blocks – Options, Settings, and Configuration

There are four main interfaces to use settings: IOptionsMonitor<TOptions>, IOptionsFactory<TOptions>, IOptionsSnapshot<TOptions>, and IOptions<TOptions>. We must inject that dependency into a class to use the available settings. TOptions is the type that represents the settings that we want to access.The framework returns an empty instance of your options class if you don’t configure it. We learn […]

Summary – Dependency Injection

This chapter delved into Dependency Injection, understanding its crucial role in crafting adaptable systems. We learned how DI applies the Inversion of Control principle, shifting dependency creation from the objects to the composition root. We explored the IoC container’s role in object management, service resolution and injection, and dependency lifetime management. We tackled the Control […]



         


          Terms of Use | Accessibility Privacy