diff --git a/BotPages.Core/BotPagesApp.cs b/BotPages.Core/BotPagesApp.cs index 4e24099..74c1563 100644 --- a/BotPages.Core/BotPagesApp.cs +++ b/BotPages.Core/BotPagesApp.cs @@ -4,6 +4,7 @@ using BotPages.Core.Abstractions; using BotPages.Core.Context; using BotPages.Core.Logging; using BotPages.Core.Routing; +using System.Reflection; /// /// Основное приложение BotPages. @@ -90,6 +91,45 @@ public sealed class BotPagesApp return this; } + /// + /// Зарегистрировать все маршруты для страницы. + /// Маршрутом является . + /// Если отсутствует, то + /// + public BotPagesApp AutoMapRoute() + { + // Берём все загруженные сборки в текущем AppDomain + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + + // Находим все типы, которые наследуются от Page + var pageTypes = assemblies + .SelectMany(a => + { + try + { + return a.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + // Если часть типов не загрузилась — берём только успешные + return ex.Types.Where(t => t != null)!; + } + }) + .Where(t => t != null + && t.IsClass + && !t.IsAbstract + && t.IsSubclassOf(typeof(Page))) + .ToList(); + + // Выводим полные имена + foreach (var type in pageTypes) + { + _routes.Map(type); + } + + return this; + } + /// /// Обработать входящее обновление. /// diff --git a/BotPages.Core/Routing/RoutesRegistry.cs b/BotPages.Core/Routing/RoutesRegistry.cs index ae02a71..066928d 100644 --- a/BotPages.Core/Routing/RoutesRegistry.cs +++ b/BotPages.Core/Routing/RoutesRegistry.cs @@ -1,4 +1,6 @@ -namespace BotPages.Core.Routing; +using System.Reflection; + +namespace BotPages.Core.Routing; /// /// Реестр маршрутов страниц. @@ -26,4 +28,14 @@ internal sealed class RoutesRegistry /// Получить снимок всех маршрутов. /// public IReadOnlyDictionary Snapshot() => _routes; + + internal void Map(Type? type) + { + foreach(var attr in type.GetCustomAttributes(inherit: true)) + { + _routes.Add(attr.Template, type); + } + + _routes.Add(type.FullName, type); + } } diff --git a/TZ.md b/TZ.md index f76bd8b..34ef4de 100644 --- a/TZ.md +++ b/TZ.md @@ -17,7 +17,6 @@ - **Page** — класс, отвечающий за состояние экрана бота. - `Page` — базовый класс. - `Page` — страница с аргументами. - - `ModalPage` / `ModalPage` — модальная страница (перехватывает ввод, блокирует переходы). - **Контекст:** - `UserContext` — данные пользователя (UserId, MessengerType). - `ChatContext` — данные чата (ChatId, Title, ThreadId?, ленивое обновление). @@ -25,7 +24,7 @@ - **Состояние:** - `IStateStorage` — универсальный интерфейс хранения. - Базовая реализация: InMemory. - - Ключ: `CompositeSessionKey(MessengerType:string, ChatId, UserId?)`. + - Ключ: `CompositeSessionKey(MessengerType:string, ChatId, UserId)`. - История состояний: опционально (None, LastN, TimeWindow, Full). --- @@ -125,7 +124,7 @@ ``` - Пример: ```csharp - app.AddMiddleware(); + app.AddMiddleware(); app.AddMiddleware(params); ``` - Порядок регистрации = порядок выполнения.