dotnet-cqrs/Svrnty.CQRS/Discovery/QueryDiscovery.cs
2025-11-10 03:40:25 -05:00

45 lines
1.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Svrnty.CQRS.Abstractions.Discovery;
namespace Svrnty.CQRS.Discovery;
public sealed class QueryDiscovery : IQueryDiscovery
{
private readonly List<IQueryMeta> _queryMetas;
private readonly Dictionary<string, IQueryMeta> _queriesByName;
private readonly Dictionary<Type, IQueryMeta> _queriesByType;
public QueryDiscovery(IEnumerable<IQueryMeta> queryMetas)
{
// Materialize the enumerable to a list once
_queryMetas = queryMetas.ToList();
// Build lookup dictionaries for O(1) access
_queriesByName = new Dictionary<string, IQueryMeta>(_queryMetas.Count);
_queriesByType = new Dictionary<Type, IQueryMeta>(_queryMetas.Count);
foreach (var meta in _queryMetas)
{
_queriesByName[meta.Name] = meta;
_queriesByType[meta.QueryType] = meta;
}
}
public IEnumerable<IQueryMeta> GetQueries() => _queryMetas;
public IQueryMeta FindQuery(string name) =>
_queriesByName.TryGetValue(name, out var meta) ? meta : null;
public IQueryMeta FindQuery(Type queryType) =>
_queriesByType.TryGetValue(queryType, out var meta) ? meta : null;
public bool QueryExists(string name) =>
_queriesByName.ContainsKey(name);
public bool QueryExists(Type queryType) =>
_queriesByType.ContainsKey(queryType);
}