readme and publish workflow
All checks were successful
.NET Test / test (push) Successful in 1m0s
.NET Publish / publish (push) Successful in 1m1s

This commit is contained in:
2025-02-02 11:51:55 +04:00
parent d437d06c09
commit 7c3dd84971
2 changed files with 109 additions and 5 deletions

View File

@@ -0,0 +1,38 @@
name: .NET Publish
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-rc[0-9]+'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: https://github.com/actions/setup-dotnet@v4
with:
dotnet-version: 9.x
- name: Restore dependencies
run: dotnet restore --nologo
- name: Test
run: dotnet test --nologo --no-restore --configuration Release
- name: Create the package
env:
RELEASE_VERSION: ${{ gitea.ref_name }}
run: >
dotnet pack --no-restore --configuration Release --output nupkgs
`echo $RELEASE_VERSION | sed -E 's|^(v([0-9]+(\.[0-9]+){2}))(-([a-z0-9]+)){1}|/p:ReleaseVersion=\2 /p:VersionSuffix=\5|; s|^(v([0-9]+(\.[0-9]+){2}))$|/p:ReleaseVersion=\2|'`
- name: Publish the package to Gitea
run: dotnet nuget push --source ${{ vars.OUTPUT_NUGET_REGISTRY }} --api-key ${{ secrets.LOCAL_NUGET_PACKAGE_TOKEN }} nupkgs/*.nupkg
- name: Publish the package to NuGet.org
run: dotnet nuget push --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_PACKAGE_TOKEN }} nupkgs/*.nupkg

View File

@@ -7,24 +7,90 @@ Inspired by [MediatR](https://github.com/jbogard/MediatR)
## Features ## Features
* Separate dispatching of Commands/Queries * Separate dispatching of Commands/Queries
* Middleware-like behaviours * Middleware-like Behaviors
## Compatibility
**Just.Cqrs** is built for .Net Standard 2.1 and .NET 8.0 and 9.0.
## Getting Started ## Getting Started
### Install from NuGet.org ### Install from NuGet.org
``` ```bash
# install the package using NuGet # install the package using NuGet
dotnet add package Just.Cqrs dotnet add package Just.Cqrs
``` ```
### Register in DI with ```IServiceCollection``` ### Register in DI with ```IServiceCollection```
```cs ```csharp
services.AddCqrs(opt => opt services.AddCqrs(opt => opt
.AddQueryHandler<SomeQueryHandler>() .AddQueryHandler<SomeQueryHandler>()
.AddCommandHandler<SomeCommandHandler>() .AddCommandHandler<SomeCommandHandler>()
.AddBehaviour<SomeBehaviour>() .AddBehavior<SomeQueryBehavior>()
.AddOpenBehaviour(typeof(SomeOpenBehaviour<,>)) .AddOpenBehavior(typeof(LoggingBehavior<,>))
); );
``` ```
## Example Usage
### Define a Query and Handler
```csharp
record GetUserByIdQuery(int UserId) : IKnownQuery<User>;
class GetUserByIdQueryHandler : IQueryHandler<GetUserByIdQuery, User>
{
public ValueTask<User> Handle(GetUserByIdQuery query, CancellationToken cancellationToken)
{
// Fetch user logic here
}
}
// Use Dispatcher to execute the query
class GetUserByIdUseCase(IQueryDispatcher dispatcher)
{
public async Task<IResult> Execute(int userId, CancellationToken cancellationToken)
{
var user = await dispatcher.Dispatch(new GetUserByIdQuery(userId), cancellationToken);
}
}
```
\* *the same principles apply to commands*
### Define a Behavior
```csharp
class LoggingBehavior<TRequest, TResult>(ILogger logger) : IDispatchBehavior<TRequest, TResult>
where TRequest: notnull
{
public async ValueTask<TResult> Handle(
TRequest request,
DispatchFurtherDelegate<TResult> next,
CancellationToken cancellationToken)
{
logger.LogInformation("Handling request: {RequestType}", typeof(TRequest).Name);
var result = await next();
logger.LogInformation("Request handled: {RequestType}", typeof(TRequest).Name);
return result;
}
}
class SomeQueryBehavior : IDispatchBehavior<SomeQuery, SomeQueryResult>
{
public async ValueTask<SomeQueryResult> Handle(
SomeQuery request,
DispatchFurtherDelegate<SomeQueryResult> next,
CancellationToken cancellationToken)
{
// do something
return await next();
}
}
```
## License
**Just.Cqrs** is licensed under the [MIT License](LICENSE).