Refactor messaging system to utilize LiteCqrs library
- Replaced instances of the previous messaging system with LiteCqrs across various application components, enhancing the CQRS implementation. - Updated dependency injection to register LiteCqrs services and behaviors, streamlining command and query handling. - Adjusted multiple command and query handlers to align with the new messaging framework, ensuring consistent functionality and improved maintainability. - Added LiteCqrs package reference in the project file for better dependency management.
This commit is contained in:
@@ -133,9 +133,14 @@ PnvPanel — backend на **ASP.NET Core (.NET 10)** по принципам **C
|
||||
|
||||
- **Команды** меняют состояние, возвращают `Result` / `Result<T>`; выполняются в транзакции (UnitOfWorkBehavior).
|
||||
- **Запросы** только читают; могут ходить в БД проекциями (`Select` в DTO) без загрузки сущностей целиком.
|
||||
- Диспетчер — **собственный тонкий `ISender`**: резолвит хендлер команды/запроса из DI и прогоняет
|
||||
через pipeline behaviors. Без внешних CQRS-библиотек (MediatR/и т.п.). Абстракции — `ICommand<T>`,
|
||||
`IQuery<T>`, `ICommandHandler<,>`, `IQueryHandler<,>`, `IPipelineBehavior<,>`.
|
||||
- Диспетчер — `ISender` из [`LiteCqrs.Net`](https://github.com/mrleo1nid/LiteCqrs.Net) (собственная
|
||||
лёгкая CQRS-библиотека, альтернатива MediatR с явным разделением Command/Query — сосед-репозиторий
|
||||
в `D:\Github`, пока подключён `ProjectReference`'ом, не через NuGet): резолвит хендлер
|
||||
команды/запроса из DI (dynamic-free кэшированный диспетчер) и прогоняет через pipeline behaviors.
|
||||
Абстракции — `ICommand<T>`, `IQuery<T>`, `ICommandHandler<,>`, `IQueryHandler<,>`,
|
||||
`IPipelineBehavior<,>` — все из `LiteCqrs`; PnvPanel-специфичные behaviors (`ValidationBehavior`,
|
||||
`RequireActivationBehavior`, `UnitOfWorkBehavior`) и маркер `IRequiresActivation` остаются в
|
||||
`Application/Common/Behaviors`.
|
||||
|
||||
Пример потока «создать конфиг» (`backend/src/PnvPanel.Application/Configs/Create/CreateVpnConfigCommandHandler.cs`):
|
||||
```
|
||||
|
||||
@@ -98,10 +98,13 @@ backend/
|
||||
|
||||
- **Rich domain model**: инварианты в сущностях (приватные сеттеры, фабричные методы `Node.Register(...)`,
|
||||
поведенческие методы `config.Revoke()`), а не анемичные DTO-сущности.
|
||||
- **CQRS через собственный диспетчер**: хендлеры реализуют `ICommandHandler<TCommand,TResult>` /
|
||||
`IQueryHandler<,>`; `ISender` резолвит их из DI и прогоняет через `IPipelineBehavior<,>`
|
||||
(`ValidationBehavior` → `LoggingBehavior` → `UnitOfWorkBehavior`). Без внешних CQRS-библиотек, без
|
||||
доменных событий — хендлер сам вызывает нужные порты (realtime/Telegram/аудит) синхронно.
|
||||
- **CQRS через [LiteCqrs.Net](https://github.com/mrleo1nid/LiteCqrs.Net)** (собственная лёгкая
|
||||
CQRS-библиотека, не MediatR — сосед-репозиторий, пока подключён `ProjectReference`'ом): хендлеры
|
||||
реализуют `ICommandHandler<TCommand,TResult>` / `IQueryHandler<,>`; `ISender` резолвит их из DI и
|
||||
прогоняет через `IPipelineBehavior<,>` (`LoggingBehavior` → `ValidationBehavior` →
|
||||
`RequireActivationBehavior` → `UnitOfWorkBehavior`, порядок задан в `AddLiteCqrs(...)`). Без
|
||||
доменных событий — хендлер сам вызывает нужные порты (realtime/Telegram/аудит) синхронно;
|
||||
библиотека умеет Notifications/pub-sub, но PnvPanel их не использует.
|
||||
- **Порты в Application, адаптеры в Infrastructure/Api**: никакого `Npgsql`/`SignalR`/`ThreeXui.Net` в
|
||||
Application/Domain — только интерфейсы, реализации могут жить и в `Infrastructure`, и в `Api`
|
||||
(`IRealtimeNotifier` реализован в `Api/Hubs`, т.к. завязан на `IHubContext<PanelHub>`).
|
||||
|
||||
+11
-5
@@ -4,11 +4,17 @@
|
||||
|
||||
- **Платформа**: .NET 10, ASP.NET Core Web API (Minimal API).
|
||||
- **Архитектура**: Clean Architecture, 4 проекта — `Domain / Application / Infrastructure / Api`.
|
||||
- **CQRS**: собственный тонкий диспетчер (`ISender`), без MediatR. `ISender.Send()` резолвит
|
||||
`ICommandHandler<,>`/`IQueryHandler<,>` из DI и прогоняет через `IPipelineBehavior<,>`:
|
||||
`ValidationBehavior` (FluentValidation), `LoggingBehavior`, `UnitOfWorkBehavior` (транзакция +
|
||||
`SaveChangesAsync` на команду). Авторизация проверяется на уровне эндпоинта
|
||||
(`RequireAuthorization(...)`), более тонкие проверки (владение, активация) — в хендлере.
|
||||
- **CQRS**: через [`LiteCqrs.Net`](https://github.com/mrleo1nid/LiteCqrs.Net) — собственную лёгкую
|
||||
CQRS-библиотеку (сосед-репозиторий, на время разработки подключён `ProjectReference`'ом; ещё не
|
||||
опубликован в NuGet), альтернативу MediatR с явным разделением Command/Query. `ISender.Send()`
|
||||
резолвит `ICommandHandler<,>`/`IQueryHandler<,>` из DI (dynamic-free кэшированный диспетчер) и
|
||||
прогоняет через `IPipelineBehavior<,>`: `LoggingBehavior` (готовый, из `LiteCqrs.Behaviors`),
|
||||
`ValidationBehavior` (FluentValidation, свой), `RequireActivationBehavior` (свой),
|
||||
`UnitOfWorkBehavior` (транзакция + `SaveChangesAsync` на команду, свой) — регистрация через
|
||||
`AddLiteCqrs(...)` в `PnvPanel.Application/DependencyInjection.cs`. Библиотека также даёт
|
||||
Notifications/pub-sub, exception behaviors и streaming-запросы — PnvPanel их пока не использует.
|
||||
Авторизация проверяется на уровне эндпоинта (`RequireAuthorization(...)`), более тонкие проверки
|
||||
(владение, активация) — в хендлере.
|
||||
- **Валидация**: FluentValidation, подключается через `ValidationBehavior` (не для каждой команды —
|
||||
только там, где есть что проверить помимо типов).
|
||||
- **Маппинг**: вручную, статический метод `XxxDto.FromDomain(entity)` на самом DTO.
|
||||
|
||||
Reference in New Issue
Block a user