dotnet-cqrs/docs/core-features/queries/query-registration.md

2.3 KiB

Query Registration

How to register query handlers in dependency injection.

Basic Registration

builder.Services.AddQuery<GetUserQuery, UserDto, GetUserQueryHandler>();

This registers:

  • Handler as IQueryHandler<GetUserQuery, UserDto>
  • Metadata for endpoint discovery
  • Scoped lifetime (default)

Registration with Validator

builder.Services.AddQuery<SearchUsersQuery, List<UserDto>, SearchUsersQueryHandler, SearchUsersQueryValidator>();

This registers:

  • Handler
  • Validator as IValidator<SearchUsersQuery>
  • Metadata

Bulk Registration

Extension Methods

public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddUserQueries(this IServiceCollection services)
    {
        services.AddQuery<GetUserQuery, UserDto, GetUserQueryHandler>();
        services.AddQuery<ListUsersQuery, List<UserDto>, ListUsersQueryHandler>();
        services.AddQuery<SearchUsersQuery, PagedResult<UserDto>, SearchUsersQueryHandler, SearchUsersQueryValidator>();
        return services;
    }
}

// Usage
builder.Services.AddUserQueries();

By Feature

public static IServiceCollection AddOrderQueries(this IServiceCollection services)
{
    services.AddQuery<GetOrderQuery, OrderDto, GetOrderQueryHandler>();
    services.AddQuery<ListOrdersQuery, PagedResult<OrderDto>, ListOrdersQueryHandler>();
    services.AddQuery<GetOrderStatisticsQuery, OrderStatistics, GetOrderStatisticsQueryHandler>();
    return services;
}

Service Lifetimes

Scoped (Default)

services.AddQuery<GetUserQuery, UserDto, GetUserQueryHandler>();
// Handler is Scoped - can inject DbContext

Custom Lifetime

// Transient
services.AddTransient<IQueryHandler<GetUserQuery, UserDto>, GetUserQueryHandler>();

// Singleton (not recommended for queries with DbContext)
services.AddSingleton<IQueryHandler<GetUserQuery, UserDto>, GetUserQueryHandler>();

Organization Patterns

By Domain

Extensions/
  UserQueryRegistration.cs
  OrderQueryRegistration.cs
  ProductQueryRegistration.cs

By Type

Extensions/
  QueryRegistration.cs
  CommandRegistration.cs

See Also