2.3 KiB
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