45 lines
1.4 KiB
C#
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);
|
|
}
|
|
|