Extensions
Namespace: RA.Utilities.Feature.Extensions
The primary purpose of this namespace is to provide a fluent and discoverable API for registering your CQRS features (commands, queries, notifications, and their associated behaviors/validators) with the .NET dependency injection container.
It acts as the main entry point for wiring up the components of the RA.Utilities.Feature library — from the one-line AddMediator() bootstrap to the fluent AddFeature builders.
🔑 Key Purpose and Design
The FeatureBuilderExtensions class uses the Builder Pattern to create a clean, readable, and chainable configuration experience.
Let's break down how it works:
1. Bootstrapping the Feature:
The process starts with an extension method on IServiceCollection,
such as AddFeature or AddNotification.
// From: /RA.Utilities/Application/RA.Utilities.Feature/Extensions/FeatureBuilderExtensions.cs
public static FeatureBuilder<TRequest, TResponse> AddFeature<TRequest, TResponse, THandler>(
this IServiceCollection services)
where TRequest : IRequest<TResponse>
where THandler : class, IRequestHandler<TRequest, TResponse>
{
// Step 1: It registers the core handler for the request.
services.AddScoped<IRequestHandler<TRequest, TResponse>, THandler>();
// Step 2: It returns a new builder object.
return new FeatureBuilder<TRequest, TResponse>(services);
}
2. Enabling Fluent Chaining:
The key is that these methods return a FeatureBuilder or NotificationFeatureBuilder object.
This builder object holds a reference to the IServiceCollection
and provides its own methods for adding related components, like validators or pipeline behaviors.
3. Creating a Vertical Slice Configuration:
This design allows you to define an entire vertical slice in a single, coherent block of code
example:
_ = services
.AddFeature<CreateProductCommand, int, CreateProductHandler>() // 1. Starts with the extension method
.AddDecoration<LoggingBehavior<CreateProductCommand, int>>() // 2. Chains a behavior from the returned builder
.AddValidator<CreateProductCommandValidator>(); // 3. Chains a validator from the builder
FeatureBuilderExtensions
The FeatureBuilderExtensions class is the primary entry point for configuring the RA.Utilities.Feature library within your application.
MediatorServiceCollectionExtensions
The MediatorServiceCollectionExtensions class registers the core IMediator service with the .NET dependency injection container and applies the compile-time handler registrations produced by the package's source generator.