Добавлено автоматические заполнение маршрутов для страниц

This commit is contained in:
2025-12-06 07:31:18 +03:00
parent d97fcaaa20
commit 07df710ce6
3 changed files with 55 additions and 4 deletions

View File

@@ -4,6 +4,7 @@ using BotPages.Core.Abstractions;
using BotPages.Core.Context; using BotPages.Core.Context;
using BotPages.Core.Logging; using BotPages.Core.Logging;
using BotPages.Core.Routing; using BotPages.Core.Routing;
using System.Reflection;
/// <summary> /// <summary>
/// Основное приложение BotPages. /// Основное приложение BotPages.
@@ -90,6 +91,45 @@ public sealed class BotPagesApp
return this; return this;
} }
/// <summary>
/// Зарегистрировать все маршруты для страницы.
/// Маршрутом является <see cref="RouteAttribute"/>.
/// Если отсутствует, то
/// </summary>
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;
}
/// <summary> /// <summary>
/// Обработать входящее обновление. /// Обработать входящее обновление.
/// </summary> /// </summary>

View File

@@ -1,4 +1,6 @@
namespace BotPages.Core.Routing; using System.Reflection;
namespace BotPages.Core.Routing;
/// <summary> /// <summary>
/// Реестр маршрутов страниц. /// Реестр маршрутов страниц.
@@ -26,4 +28,14 @@ internal sealed class RoutesRegistry
/// Получить снимок всех маршрутов. /// Получить снимок всех маршрутов.
/// </summary> /// </summary>
public IReadOnlyDictionary<string, Type> Snapshot() => _routes; public IReadOnlyDictionary<string, Type> Snapshot() => _routes;
internal void Map(Type? type)
{
foreach(var attr in type.GetCustomAttributes<RouteAttribute>(inherit: true))
{
_routes.Add(attr.Template, type);
}
_routes.Add(type.FullName, type);
}
} }

5
TZ.md
View File

@@ -17,7 +17,6 @@
- **Page** — класс, отвечающий за состояние экрана бота. - **Page** — класс, отвечающий за состояние экрана бота.
- `Page` — базовый класс. - `Page` — базовый класс.
- `Page<TArguments>` — страница с аргументами. - `Page<TArguments>` — страница с аргументами.
- `ModalPage` / `ModalPage<TArguments>` — модальная страница (перехватывает ввод, блокирует переходы).
- **Контекст:** - **Контекст:**
- `UserContext` — данные пользователя (UserId, MessengerType). - `UserContext` — данные пользователя (UserId, MessengerType).
- `ChatContext` — данные чата (ChatId, Title, ThreadId?, ленивое обновление). - `ChatContext` — данные чата (ChatId, Title, ThreadId?, ленивое обновление).
@@ -25,7 +24,7 @@
- **Состояние:** - **Состояние:**
- `IStateStorage` — универсальный интерфейс хранения. - `IStateStorage` — универсальный интерфейс хранения.
- Базовая реализация: InMemory. - Базовая реализация: InMemory.
- Ключ: `CompositeSessionKey(MessengerType:string, ChatId, UserId?)`. - Ключ: `CompositeSessionKey(MessengerType:string, ChatId, UserId)`.
- История состояний: опционально (None, LastN, TimeWindow, Full). - История состояний: опционально (None, LastN, TimeWindow, Full).
--- ---
@@ -125,7 +124,7 @@
``` ```
- Пример: - Пример:
```csharp ```csharp
app.AddMiddleware<IUpdateMiddleware, LoggingMiddleware>(); app.AddMiddleware<LoggingMiddleware>();
app.AddMiddleware<ErrorMiddleware>(params); app.AddMiddleware<ErrorMiddleware>(params);
``` ```
- Порядок регистрации = порядок выполнения. - Порядок регистрации = порядок выполнения.