Skip to footer content
Iron Academy Logo
Learn C#

Understanding C# Set Flag Enum: Assigning Flags

Tim Corey
10m 39s

Configuration management is an essential aspect of building scalable and maintainable applications in C#. One of the most effective ways to handle configuration settings is by using the Options Pattern. In his video, The Options Pattern in C# in 10 Minutes or Less, Tim Corey provides a concise yet insightful explanation of this pattern and how to implement it efficiently. In this article, we will explore the Options Pattern through Tim's explanations and demonstrations from his video.

Introduction

Tim begins by introducing the Options Pattern as a powerful yet simple way to retrieve information from configuration files and inject it into dependency injection (DI). He highlights several advantages of this pattern, such as:

  • The ability to manage runtime value changes.
  • Built-in data validation support.
  • Compatibility with various C# project types, including Blazor applications.

Tim emphasizes that while he usually provides in-depth technical training, this video is designed as a quick-start guide to implementing the Options Pattern.

Setting Up the Project

Tim starts by opening Visual Studio with a Blazor Web App (server-side rendering only). He has already made a few modifications to speed up the demonstration. The key setup involves:

  • Creating an appsettings.json file with a CloudInfo section containing three key-value pairs.
  • Using a Plain Old CLR Object (POCO) model called CloudInfoOptions, which maps to these configuration values.

The Configuration File

The appsettings.json file contains the following section:

{
  "CloudInfo": {
    "Storage": "Azure Storage",
    "Website": "Azure Static Web Apps",
    "API": "Azure Web App"
  }
}

Tim clarifies that while he is using appsettings.json, the configuration values could also come from:

  • appsettings.Development.json
  • secrets.json
  • Environment variables

Binding Configuration to Options

Now, Tim explains how to bind the configuration values to the CloudInfoOptions class and inject them into DI.

Registering Options in Program.cs

In Program.cs, Tim adds the following line inside builder.Services:

builder.Services.Configure<CloudInfoOptions>(builder.Configuration.GetSection("CloudInfo"));
builder.Services.Configure<CloudInfoOptions>(builder.Configuration.GetSection("CloudInfo"));

This binds the CloudInfo section of appsettings.json to the CloudInfoOptions class. Tim notes that this step ensures the values are available in dependency injection.

Injecting Options in a Razor Component

Tim moves to the Home Page component (Index.razor) and modifies it to display configuration values dynamically.

He injects the IOptions interface into the component:

@inject IOptions<CloudInfoOptions> CloudInfoOptions

To retrieve the actual values, he assigns them inside OnInitialized:

protected override void OnInitialized()
{
    CloudInfo = CloudInfoOptions.Value;
}
protected override void OnInitialized()
{
    CloudInfo = CloudInfoOptions.Value;
}

Tim explains that IOptions<T> provides a Singleton instance of the configuration values, meaning it remains constant throughout the application's lifecycle. When the application runs, the configuration values correctly appear on the page.

Exploring Different Options Interfaces

Tim then introduces three different ways to use the Options Pattern:

1. Singleton Options

By default, IOptions<T> provides a Singleton instance. Tim demonstrates that if the configuration file is updated while the app is running, the changes do not reflect unless the application is restarted.

2. Scoped Options - Using IOptionsSnapshot<T>

To enable per-request updates, Tim modifies the injection to:

@inject IOptionsSnapshot<CloudInfoOptions> CloudInfoOptions

This ensures that every new HTTP request gets fresh configuration values. Tim tests this by modifying appsettings.json, refreshing the page, and showing that the updated values now appear immediately.

He explains that IOptionsSnapshot<T> is useful for scenarios where changes need to be reflected without restarting the app but do not require live monitoring.

3. Monitoring Changes - Using IOptionsMonitor<T>

Finally, Tim introduces IOptionsMonitor<T>, which enables real-time change detection. He updates the injection to:

@inject IOptionsMonitor<CloudInfoOptions> CloudInfoOptions

Unlike IOptionsSnapshot, which updates per request, IOptionsMonitor<T> can trigger events when configuration values change. This is particularly useful when you need to react to configuration changes dynamically.

Tim notes that IOptionsMonitor<T> is backed by a singleton but can refresh values dynamically when the underlying configuration file changes.

Conclusion

Tim wraps up the video by summarizing the key differences between the three approaches:

InterfaceLifetimeUpdates on Change
IOptions<T>SingletonNo
IOptionsSnapshot<T>ScopedPer Request
IOptionsMonitor<T>SingletonYes

He emphasizes that while the Options Pattern simplifies configuration management, understanding these different variations helps in choosing the right approach based on project requirements.

By following Tim's approach, developers can efficiently manage application settings, ensure smooth dependency injection, and handle runtime configuration changes effectively. For better understanding, please watch the complete video and do visit his channel for more insightful videos on C#.

Hero Worlddot related to Understanding C# Set Flag Enum: Assigning Flags
Hero Affiliate related to Understanding C# Set Flag Enum: Assigning Flags

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!