Compare commits
14 Commits
8.0.0-prev
...
main
Author | SHA1 | Date | |
---|---|---|---|
de6e1267dd | |||
7804f9ba09 | |||
b7b88bc258 | |||
c6a28f352f | |||
edb84a792a | |||
e58b86c0fb | |||
c230d039f2 | |||
43bf6ebd6b | |||
|
2da25631bf | ||
|
5188785339 | ||
|
d328782681 | ||
|
1a54c12114 | ||
|
4598cfedb7 | ||
|
fba604ad65 |
38
.gitea/workflows/publish-nugets.yaml
Normal file
38
.gitea/workflows/publish-nugets.yaml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# This workflow will build a .NET project
|
||||||
|
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
|
||||||
|
|
||||||
|
name: Publish NuGets
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- published
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Extract Release Version
|
||||||
|
id: extract_version
|
||||||
|
run: echo "RELEASE_VERSION=${{ github.event.release.tag_name }}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Debug Release Version
|
||||||
|
run: echo "RELEASE_VERSION=${{ env.RELEASE_VERSION }}"
|
||||||
|
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 8.x
|
||||||
|
|
||||||
|
- name: Restore dependencies
|
||||||
|
run: dotnet restore
|
||||||
|
|
||||||
|
- name: Build and Pack NuGet Package
|
||||||
|
run: dotnet pack -c Release -o ./artifacts -p:Version=${{ env.RELEASE_VERSION }}
|
||||||
|
|
||||||
|
- name: Publish to NuGet.org
|
||||||
|
run: |
|
||||||
|
dotnet nuget push ./artifacts/*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }}
|
@ -31,8 +31,8 @@ jobs:
|
|||||||
run: dotnet restore
|
run: dotnet restore
|
||||||
|
|
||||||
- name: Build and Pack NuGet Package
|
- name: Build and Pack NuGet Package
|
||||||
run: dotnet pack -c Release -o ./artifacts
|
run: dotnet pack -c Release -o ./artifacts -p:Version=${{ env.RELEASE_VERSION }}
|
||||||
|
|
||||||
- name: Publish to NuGet.org
|
- name: Publish to NuGet.org
|
||||||
run: |
|
run: |
|
||||||
dotnet nuget push ./artifacts/*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --version $RELEASE_VERSION
|
dotnet nuget push ./artifacts/*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }}
|
@ -1,11 +1,29 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.1</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<PackageIconUrl>https://avatars.githubusercontent.com/u/52874619?v=4</PackageIconUrl>
|
<IsAotCompatible>true</IsAotCompatible>
|
||||||
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
||||||
<LangVersion>default</LangVersion>
|
<LangVersion>default</LangVersion>
|
||||||
|
<Company>Open Harbor</Company>
|
||||||
|
<PackageIcon>icon.png</PackageIcon>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<RepositoryUrl>https://git.openharbor.io/Open-Harbor/dotnet-cqrs</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
|
||||||
|
<DebugType>portable</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
|
<IncludeSource>true</IncludeSource>
|
||||||
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\icon.png" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
<None Include="..\README.md" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0-rc.1.23419.4" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0-rc.1.23419.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using OpenHarbor.CQRS.Abstractions.Discovery;
|
using OpenHarbor.CQRS.Abstractions.Discovery;
|
||||||
|
|
||||||
namespace OpenHarbor.CQRS.Abstractions;
|
namespace OpenHarbor.CQRS.Abstractions;
|
||||||
|
|
||||||
public static class ServiceCollectionExtensions
|
public static class ServiceCollectionExtensions
|
||||||
{
|
{
|
||||||
public static IServiceCollection AddQuery<TQuery, TQueryResult, TQueryHandler>(this IServiceCollection services)
|
public static IServiceCollection AddQuery<TQuery, TQueryResult, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TQueryHandler>(this IServiceCollection services)
|
||||||
where TQuery : class
|
where TQuery : class
|
||||||
where TQueryHandler : class, IQueryHandler<TQuery, TQueryResult>
|
where TQueryHandler : class, IQueryHandler<TQuery, TQueryResult>
|
||||||
{
|
{
|
||||||
@ -19,7 +20,7 @@ public static class ServiceCollectionExtensions
|
|||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddCommand<TCommand, TCommandResult, TCommandHandler>(this IServiceCollection services)
|
public static IServiceCollection AddCommand<TCommand, TCommandResult, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TCommandHandler>(this IServiceCollection services)
|
||||||
where TCommand : class
|
where TCommand : class
|
||||||
where TCommandHandler : class, ICommandHandler<TCommand, TCommandResult>
|
where TCommandHandler : class, ICommandHandler<TCommand, TCommandResult>
|
||||||
{
|
{
|
||||||
@ -33,7 +34,7 @@ public static class ServiceCollectionExtensions
|
|||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddCommand<TCommand, TCommandHandler>(this IServiceCollection services)
|
public static IServiceCollection AddCommand<TCommand, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TCommandHandler>(this IServiceCollection services)
|
||||||
where TCommand : class
|
where TCommand : class
|
||||||
where TCommandHandler : class, ICommandHandler<TCommand>
|
where TCommandHandler : class, ICommandHandler<TCommand>
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,26 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.1</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<PackageIconUrl>https://avatars.githubusercontent.com/u/52874619?v=4</PackageIconUrl>
|
<IsAotCompatible>true</IsAotCompatible>
|
||||||
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
<IsAotCompatible>false</IsAotCompatible>
|
||||||
<LangVersion>default</LangVersion>
|
<LangVersion>default</LangVersion>
|
||||||
|
<Company>Open Harbor</Company>
|
||||||
|
<PackageIcon>icon.png</PackageIcon>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<RepositoryUrl>https://git.openharbor.io/Open-Harbor/dotnet-cqrs</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
|
||||||
|
<DebugType>portable</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
|
<IncludeSource>true</IncludeSource>
|
||||||
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\icon.png" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
<None Include="..\README.md" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -8,28 +8,22 @@ using OpenHarbor.CQRS.AspNetCore.Abstractions.Attributes;
|
|||||||
|
|
||||||
namespace OpenHarbor.CQRS.AspNetCore.Mvc;
|
namespace OpenHarbor.CQRS.AspNetCore.Mvc;
|
||||||
|
|
||||||
public class QueryControllerFeatureProvider : IApplicationFeatureProvider<ControllerFeature>
|
public class QueryControllerFeatureProvider(ServiceProvider serviceProvider)
|
||||||
|
: IApplicationFeatureProvider<ControllerFeature>
|
||||||
{
|
{
|
||||||
private readonly ServiceProvider _serviceProvider;
|
|
||||||
|
|
||||||
public QueryControllerFeatureProvider(ServiceProvider serviceProvider)
|
|
||||||
{
|
|
||||||
_serviceProvider = serviceProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
|
public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
|
||||||
{
|
{
|
||||||
var queryDiscovery = this._serviceProvider.GetRequiredService<IQueryDiscovery>();
|
var queryDiscovery = serviceProvider.GetRequiredService<IQueryDiscovery>();
|
||||||
foreach (var f in queryDiscovery.GetQueries())
|
foreach (var queryMeta in queryDiscovery.GetQueries())
|
||||||
{
|
{
|
||||||
var ignoreAttribute = f.QueryType.GetCustomAttribute<QueryControllerIgnoreAttribute>();
|
var ignoreAttribute = queryMeta.QueryType.GetCustomAttribute<QueryControllerIgnoreAttribute>();
|
||||||
if (ignoreAttribute != null)
|
if (ignoreAttribute != null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (f.Category != "BasicQuery")
|
if (queryMeta.Category != "BasicQuery")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var controllerType = typeof(QueryController<,>).MakeGenericType(f.QueryType, f.QueryResultType);
|
var controllerType = typeof(QueryController<,>).MakeGenericType(queryMeta.QueryType, queryMeta.QueryResultType);
|
||||||
var controllerTypeInfo = controllerType.GetTypeInfo();
|
var controllerTypeInfo = controllerType.GetTypeInfo();
|
||||||
feature.Controllers.Add(controllerTypeInfo);
|
feature.Controllers.Add(controllerTypeInfo);
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,28 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<PackageIconUrl>https://avatars.githubusercontent.com/u/52874619?v=4</PackageIconUrl>
|
<IsAotCompatible>false</IsAotCompatible>
|
||||||
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
||||||
<IsAotCompatible>true</IsAotCompatible>
|
<Company>Open Harbor</Company>
|
||||||
|
<PackageIcon>icon.png</PackageIcon>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<RepositoryUrl>https://git.openharbor.io/Open-Harbor/dotnet-cqrs</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
|
||||||
|
<DebugType>portable</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
|
<IncludeSource>true</IncludeSource>
|
||||||
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\icon.png" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
<None Include="..\README.md" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@ -16,4 +33,8 @@
|
|||||||
<ProjectReference Include="..\OpenHarbor.CQRS.AspNetCore.Abstractions\OpenHarbor.CQRS.AspNetCore.Abstractions.csproj" />
|
<ProjectReference Include="..\OpenHarbor.CQRS.AspNetCore.Abstractions\OpenHarbor.CQRS.AspNetCore.Abstractions.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,12 +1,29 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.1</TargetFramework>
|
<TargetFrameworks>netstandard2.1;net8.0</TargetFrameworks>
|
||||||
|
<IsAotCompatible Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">true</IsAotCompatible>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<PackageIconUrl>https://avatars.githubusercontent.com/u/52874619?v=4</PackageIconUrl>
|
|
||||||
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
|
||||||
<LangVersion>default</LangVersion>
|
<LangVersion>default</LangVersion>
|
||||||
|
<Company>Open Harbor</Company>
|
||||||
|
<PackageIcon>icon.png</PackageIcon>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<RepositoryUrl>https://git.openharbor.io/Open-Harbor/dotnet-cqrs</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
|
||||||
|
<DebugType>portable</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
|
<IncludeSource>true</IncludeSource>
|
||||||
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\icon.png" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
<None Include="..\README.md" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="PoweredSoft.DynamicQuery.Core" Version="3.0.1" />
|
<PackageReference Include="PoweredSoft.DynamicQuery.Core" Version="3.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -8,7 +8,7 @@ using PoweredSoft.DynamicQuery.Core;
|
|||||||
namespace OpenHarbor.CQRS.DynamicQuery.AspNetCore.Mvc;
|
namespace OpenHarbor.CQRS.DynamicQuery.AspNetCore.Mvc;
|
||||||
|
|
||||||
[ApiController, Route("api/query/[controller]")]
|
[ApiController, Route("api/query/[controller]")]
|
||||||
public class DynamicQueryController<TSource, TDestination> : Controller
|
public class DynamicQueryController<TUnderlyingQuery, TSource, TDestination> : Controller
|
||||||
where TSource : class
|
where TSource : class
|
||||||
where TDestination : class
|
where TDestination : class
|
||||||
{
|
{
|
||||||
@ -34,7 +34,7 @@ public class DynamicQueryController<TSource, TDestination> : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[ApiController, Route("api/query/[controller]")]
|
[ApiController, Route("api/query/[controller]")]
|
||||||
public class DynamicQueryController<TSource, TDestination, TParams> : Controller
|
public class DynamicQueryController<TUnderlyingQuery, TSource, TDestination, TParams> : Controller
|
||||||
where TSource : class
|
where TSource : class
|
||||||
where TDestination : class
|
where TDestination : class
|
||||||
where TParams : class
|
where TParams : class
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||||
@ -9,18 +10,43 @@ using OpenHarbor.CQRS.DynamicQuery.Discover;
|
|||||||
|
|
||||||
namespace OpenHarbor.CQRS.DynamicQuery.AspNetCore.Mvc;
|
namespace OpenHarbor.CQRS.DynamicQuery.AspNetCore.Mvc;
|
||||||
|
|
||||||
public class DynamicQueryControllerFeatureProvider : IApplicationFeatureProvider<ControllerFeature>
|
public class DynamicQueryControllerFeatureProvider(ServiceProvider serviceProvider)
|
||||||
|
: IApplicationFeatureProvider<ControllerFeature>
|
||||||
{
|
{
|
||||||
private readonly ServiceProvider _serviceProvider;
|
|
||||||
|
|
||||||
public DynamicQueryControllerFeatureProvider(ServiceProvider serviceProvider)
|
/**
|
||||||
|
* public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
|
||||||
{
|
{
|
||||||
_serviceProvider = serviceProvider;
|
var queryDiscovery = this.serviceProvider.GetRequiredService<IQueryDiscovery>();
|
||||||
|
foreach (var f in queryDiscovery.GetQueries())
|
||||||
|
{
|
||||||
|
var ignoreAttribute = f.QueryType.GetCustomAttribute<QueryControllerIgnoreAttribute>();
|
||||||
|
if (ignoreAttribute != null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (f.Category != "DynamicQuery")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (f is DynamicQueryMeta dynamicQueryMeta)
|
||||||
|
{
|
||||||
|
if (dynamicQueryMeta.ParamsType == null)
|
||||||
|
{
|
||||||
|
var controllerType = typeof(DynamicQueryController<,,>).MakeGenericType(f.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType);
|
||||||
|
var controllerTypeInfo = controllerType.GetTypeInfo();
|
||||||
|
feature.Controllers.Add(controllerTypeInfo);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var controllerType = typeof(DynamicQueryController<,,,>).MakeGenericType(f.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType, dynamicQueryMeta.ParamsType);
|
||||||
|
var controllerTypeInfo = controllerType.GetTypeInfo();
|
||||||
|
feature.Controllers.Add(controllerTypeInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
|
public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
|
||||||
{
|
{
|
||||||
var queryDiscovery = _serviceProvider.GetRequiredService<IQueryDiscovery>();
|
var queryDiscovery = serviceProvider.GetRequiredService<IQueryDiscovery>();
|
||||||
foreach (var queryMeta in queryDiscovery.GetQueries())
|
foreach (var queryMeta in queryDiscovery.GetQueries())
|
||||||
{
|
{
|
||||||
var ignoreAttribute = queryMeta.QueryType.GetCustomAttribute<QueryControllerIgnoreAttribute>();
|
var ignoreAttribute = queryMeta.QueryType.GetCustomAttribute<QueryControllerIgnoreAttribute>();
|
||||||
@ -32,15 +58,19 @@ public class DynamicQueryControllerFeatureProvider : IApplicationFeatureProvider
|
|||||||
|
|
||||||
if (queryMeta is DynamicQueryMeta dynamicQueryMeta)
|
if (queryMeta is DynamicQueryMeta dynamicQueryMeta)
|
||||||
{
|
{
|
||||||
|
// todo: add better error output for the user
|
||||||
|
|
||||||
if (dynamicQueryMeta.ParamsType == null)
|
if (dynamicQueryMeta.ParamsType == null)
|
||||||
{
|
{
|
||||||
var controllerType = typeof(DynamicQueryController<,>).MakeGenericType(queryMeta.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType);
|
// todo: not aot friendly
|
||||||
|
var controllerType = typeof(DynamicQueryController<,,>).MakeGenericType(queryMeta.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType);
|
||||||
var controllerTypeInfo = controllerType.GetTypeInfo();
|
var controllerTypeInfo = controllerType.GetTypeInfo();
|
||||||
feature.Controllers.Add(controllerTypeInfo);
|
feature.Controllers.Add(controllerTypeInfo);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var controllerType = typeof(DynamicQueryController<,,>).MakeGenericType(queryMeta.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType, dynamicQueryMeta.ParamsType);
|
// todo: not aot friendly
|
||||||
|
var controllerType = typeof(DynamicQueryController<,,,>).MakeGenericType(queryMeta.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType, dynamicQueryMeta.ParamsType);
|
||||||
var controllerTypeInfo = controllerType.GetTypeInfo();
|
var controllerTypeInfo = controllerType.GetTypeInfo();
|
||||||
feature.Controllers.Add(controllerTypeInfo);
|
feature.Controllers.Add(controllerTypeInfo);
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,27 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<PackageIconUrl>https://avatars.githubusercontent.com/u/52874619?v=4</PackageIconUrl>
|
<IsAotCompatible>false</IsAotCompatible>
|
||||||
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
<Company>Open Harbor</Company>
|
||||||
<IsAotCompatible>true</IsAotCompatible>
|
<PackageIcon>icon.png</PackageIcon>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<RepositoryUrl>https://git.openharbor.io/Open-Harbor/dotnet-cqrs</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
|
||||||
|
<DebugType>portable</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
|
<IncludeSource>true</IncludeSource>
|
||||||
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\icon.png" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
<None Include="..\README.md" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -1,11 +1,28 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.1</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<PackageIconUrl>https://avatars.githubusercontent.com/u/52874619?v=4</PackageIconUrl>
|
<IsAotCompatible>true</IsAotCompatible>
|
||||||
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
|
||||||
<LangVersion>default</LangVersion>
|
<LangVersion>default</LangVersion>
|
||||||
|
<Company>Open Harbor</Company>
|
||||||
|
<PackageIcon>icon.png</PackageIcon>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<RepositoryUrl>https://git.openharbor.io/Open-Harbor/dotnet-cqrs</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
|
||||||
|
<DebugType>portable</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
|
<IncludeSource>true</IncludeSource>
|
||||||
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\icon.png" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
<None Include="..\README.md" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Pluralize.NET" Version="1.0.2" />
|
<PackageReference Include="Pluralize.NET" Version="1.0.2" />
|
||||||
<PackageReference Include="PoweredSoft.DynamicQuery" Version="3.0.1" />
|
<PackageReference Include="PoweredSoft.DynamicQuery" Version="3.0.1" />
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
using OpenHarbor.CQRS.Abstractions;
|
using OpenHarbor.CQRS.Abstractions;
|
||||||
using OpenHarbor.CQRS.Abstractions.Discovery;
|
using OpenHarbor.CQRS.Abstractions.Discovery;
|
||||||
@ -35,7 +36,7 @@ public static class ServiceCollectionExtensions
|
|||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddDynamicQueryWithProvider<TSource, TQueryableProvider>(this IServiceCollection services, string name = null)
|
public static IServiceCollection AddDynamicQueryWithProvider<TSource, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TQueryableProvider>(this IServiceCollection services, string name = null)
|
||||||
where TQueryableProvider : class, IQueryableProvider<TSource>
|
where TQueryableProvider : class, IQueryableProvider<TSource>
|
||||||
where TSource : class
|
where TSource : class
|
||||||
{
|
{
|
||||||
@ -44,7 +45,7 @@ public static class ServiceCollectionExtensions
|
|||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddDynamicQueryWithParamsAndProvider<TSource, TParams, TQueryableProvider>(this IServiceCollection services, string name = null)
|
public static IServiceCollection AddDynamicQueryWithParamsAndProvider<TSource, TParams, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TQueryableProvider>(this IServiceCollection services, string name = null)
|
||||||
where TQueryableProvider : class, IQueryableProvider<TSource>
|
where TQueryableProvider : class, IQueryableProvider<TSource>
|
||||||
where TParams : class
|
where TParams : class
|
||||||
where TSource : class
|
where TSource : class
|
||||||
@ -84,19 +85,19 @@ public static class ServiceCollectionExtensions
|
|||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddAlterQueryable<TSourceAndDestination, TService>(this IServiceCollection services)
|
public static IServiceCollection AddAlterQueryable<TSourceAndDestination, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TService>(this IServiceCollection services)
|
||||||
where TService : class, IAlterQueryableService<TSourceAndDestination, TSourceAndDestination>
|
where TService : class, IAlterQueryableService<TSourceAndDestination, TSourceAndDestination>
|
||||||
{
|
{
|
||||||
return services.AddTransient<IAlterQueryableService<TSourceAndDestination, TSourceAndDestination>, TService>();
|
return services.AddTransient<IAlterQueryableService<TSourceAndDestination, TSourceAndDestination>, TService>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddAlterQueryable<TSource, TDestination, TService>(this IServiceCollection services)
|
public static IServiceCollection AddAlterQueryable<TSource, TDestination, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TService>(this IServiceCollection services)
|
||||||
where TService : class, IAlterQueryableService<TSource, TDestination>
|
where TService : class, IAlterQueryableService<TSource, TDestination>
|
||||||
{
|
{
|
||||||
return services.AddTransient<IAlterQueryableService<TSource, TDestination>, TService>();
|
return services.AddTransient<IAlterQueryableService<TSource, TDestination>, TService>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddAlterQueryableWithParams<TSourceAndTDestination, TParams, TService>
|
public static IServiceCollection AddAlterQueryableWithParams<TSourceAndTDestination, TParams, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TService>
|
||||||
(this IServiceCollection services)
|
(this IServiceCollection services)
|
||||||
where TParams : class
|
where TParams : class
|
||||||
where TService : class, IAlterQueryableService<TSourceAndTDestination, TSourceAndTDestination, TParams>
|
where TService : class, IAlterQueryableService<TSourceAndTDestination, TSourceAndTDestination, TParams>
|
||||||
@ -104,7 +105,7 @@ public static class ServiceCollectionExtensions
|
|||||||
return services.AddTransient<IAlterQueryableService< TSourceAndTDestination, TSourceAndTDestination, TParams>, TService>();
|
return services.AddTransient<IAlterQueryableService< TSourceAndTDestination, TSourceAndTDestination, TParams>, TService>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddAlterQueryableWithParams<TSource, TDestination, TParams, TService>
|
public static IServiceCollection AddAlterQueryableWithParams<TSource, TDestination, TParams, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TService>
|
||||||
(this IServiceCollection services)
|
(this IServiceCollection services)
|
||||||
where TParams : class
|
where TParams : class
|
||||||
where TService : class, IAlterQueryableService<TSource, TDestination, TParams>
|
where TService : class, IAlterQueryableService<TSource, TDestination, TParams>
|
||||||
@ -112,7 +113,7 @@ public static class ServiceCollectionExtensions
|
|||||||
return services.AddTransient<IAlterQueryableService<TSource, TDestination, TParams>, TService>();
|
return services.AddTransient<IAlterQueryableService<TSource, TDestination, TParams>, TService>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddDynamicQueryInterceptor<TSource, TDestination, TInterceptor>(this IServiceCollection services)
|
public static IServiceCollection AddDynamicQueryInterceptor<TSource, TDestination, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TInterceptor>(this IServiceCollection services)
|
||||||
where TInterceptor : class, IQueryInterceptor
|
where TInterceptor : class, IQueryInterceptor
|
||||||
{
|
{
|
||||||
services.TryAddTransient<TInterceptor>();
|
services.TryAddTransient<TInterceptor>();
|
||||||
@ -120,7 +121,7 @@ public static class ServiceCollectionExtensions
|
|||||||
new DynamicQueryInterceptorProvider<TSource, TDestination>(typeof(TInterceptor)));
|
new DynamicQueryInterceptorProvider<TSource, TDestination>(typeof(TInterceptor)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddDynamicQueryInterceptors<TSource, TDestination, T1, T2>(this IServiceCollection services)
|
public static IServiceCollection AddDynamicQueryInterceptors<TSource, TDestination, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T2>(this IServiceCollection services)
|
||||||
where T1 : class, IQueryInterceptor
|
where T1 : class, IQueryInterceptor
|
||||||
where T2 : class, IQueryInterceptor
|
where T2 : class, IQueryInterceptor
|
||||||
{
|
{
|
||||||
@ -130,7 +131,7 @@ public static class ServiceCollectionExtensions
|
|||||||
new DynamicQueryInterceptorProvider<TSource, TDestination>(typeof(T1), typeof(T2)));
|
new DynamicQueryInterceptorProvider<TSource, TDestination>(typeof(T1), typeof(T2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddDynamicQueryInterceptors<TSource, TDestination, T1, T2, T3>(this IServiceCollection services)
|
public static IServiceCollection AddDynamicQueryInterceptors<TSource, TDestination, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T2, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T3>(this IServiceCollection services)
|
||||||
where T1 : class, IQueryInterceptor
|
where T1 : class, IQueryInterceptor
|
||||||
where T2 : class, IQueryInterceptor
|
where T2 : class, IQueryInterceptor
|
||||||
where T3 : class, IQueryInterceptor
|
where T3 : class, IQueryInterceptor
|
||||||
@ -142,7 +143,7 @@ public static class ServiceCollectionExtensions
|
|||||||
new DynamicQueryInterceptorProvider<TSource, TDestination>(typeof(T1), typeof(T2), typeof(T3)));
|
new DynamicQueryInterceptorProvider<TSource, TDestination>(typeof(T1), typeof(T2), typeof(T3)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddDynamicQueryInterceptors<TSource, TDestination, T1, T2, T3, T4>(this IServiceCollection services)
|
public static IServiceCollection AddDynamicQueryInterceptors<TSource, TDestination, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T2, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T3, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T4>(this IServiceCollection services)
|
||||||
where T1 : class, IQueryInterceptor
|
where T1 : class, IQueryInterceptor
|
||||||
where T2 : class, IQueryInterceptor
|
where T2 : class, IQueryInterceptor
|
||||||
where T3 : class, IQueryInterceptor
|
where T3 : class, IQueryInterceptor
|
||||||
@ -156,7 +157,7 @@ public static class ServiceCollectionExtensions
|
|||||||
new DynamicQueryInterceptorProvider<TSource, TDestination>(typeof(T1), typeof(T2), typeof(T3), typeof(T4)));
|
new DynamicQueryInterceptorProvider<TSource, TDestination>(typeof(T1), typeof(T2), typeof(T3), typeof(T4)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddDynamicQueryInterceptors<TSource, TDestination, T1, T2, T3, T4, T5>(this IServiceCollection services)
|
public static IServiceCollection AddDynamicQueryInterceptors<TSource, TDestination, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T2, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T3, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T4, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T5>(this IServiceCollection services)
|
||||||
where T1 : class, IQueryInterceptor
|
where T1 : class, IQueryInterceptor
|
||||||
where T2 : class, IQueryInterceptor
|
where T2 : class, IQueryInterceptor
|
||||||
where T3 : class, IQueryInterceptor
|
where T3 : class, IQueryInterceptor
|
||||||
|
@ -1,11 +1,28 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.1</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<PackageIconUrl>https://avatars.githubusercontent.com/u/52874619?v=4</PackageIconUrl>
|
<IsAotCompatible>true</IsAotCompatible>
|
||||||
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
|
||||||
<LangVersion>default</LangVersion>
|
<LangVersion>default</LangVersion>
|
||||||
|
<Company>Open Harbor</Company>
|
||||||
|
<PackageIcon>icon.png</PackageIcon>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<RepositoryUrl>https://git.openharbor.io/Open-Harbor/dotnet-cqrs</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
|
||||||
|
<DebugType>portable</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
|
<IncludeSource>true</IncludeSource>
|
||||||
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\icon.png" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
<None Include="..\README.md" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="FluentValidation" Version="10.4.0" />
|
<PackageReference Include="FluentValidation" Version="10.4.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using FluentValidation;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using FluentValidation;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using OpenHarbor.CQRS.Abstractions;
|
using OpenHarbor.CQRS.Abstractions;
|
||||||
|
|
||||||
@ -6,14 +7,14 @@ namespace OpenHarbor.CQRS.FluentValidation;
|
|||||||
|
|
||||||
public static class ServiceCollectionExtensions
|
public static class ServiceCollectionExtensions
|
||||||
{
|
{
|
||||||
private static IServiceCollection AddFluentValidator<T, TValidator>(this IServiceCollection services)
|
private static IServiceCollection AddFluentValidator<T, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TValidator>(this IServiceCollection services)
|
||||||
where TValidator : class, IValidator<T>
|
where TValidator : class, IValidator<T>
|
||||||
{
|
{
|
||||||
services.AddTransient<IValidator<T>, TValidator>();
|
services.AddTransient<IValidator<T>, TValidator>();
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddCommand<TCommand, TCommandHandler, TValidator>(this IServiceCollection services)
|
public static IServiceCollection AddCommand<TCommand, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TCommandHandler, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TValidator>(this IServiceCollection services)
|
||||||
where TCommand : class
|
where TCommand : class
|
||||||
where TCommandHandler : class, ICommandHandler<TCommand>
|
where TCommandHandler : class, ICommandHandler<TCommand>
|
||||||
where TValidator : class, IValidator<TCommand>
|
where TValidator : class, IValidator<TCommand>
|
||||||
@ -22,7 +23,7 @@ public static class ServiceCollectionExtensions
|
|||||||
.AddFluentValidator<TCommand, TValidator>();
|
.AddFluentValidator<TCommand, TValidator>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddCommand<TCommand, TCommandResult, TCommandHandler, TValidator>(this IServiceCollection services)
|
public static IServiceCollection AddCommand<TCommand, TCommandResult, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TCommandHandler, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TValidator>(this IServiceCollection services)
|
||||||
where TCommand : class
|
where TCommand : class
|
||||||
where TCommandHandler : class, ICommandHandler<TCommand, TCommandResult>
|
where TCommandHandler : class, ICommandHandler<TCommand, TCommandResult>
|
||||||
where TValidator : class, IValidator<TCommand>
|
where TValidator : class, IValidator<TCommand>
|
||||||
@ -31,13 +32,14 @@ public static class ServiceCollectionExtensions
|
|||||||
.AddFluentValidator<TCommand, TValidator>();
|
.AddFluentValidator<TCommand, TValidator>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddQuery<TQuery, TQueryResult, TQueryHandler, TValidator>(this IServiceCollection services)
|
public static IServiceCollection AddQuery<TQuery, TQueryResult, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TQueryHandler, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TValidator>(this IServiceCollection services)
|
||||||
where TQuery : class
|
where TQuery : class
|
||||||
where TQueryHandler : class, IQueryHandler<TQuery, TQueryResult>
|
where TQueryHandler : class, IQueryHandler<TQuery, TQueryResult>
|
||||||
where TValidator : class, IValidator<TQuery>
|
where TValidator : class, IValidator<TQuery>
|
||||||
{
|
{
|
||||||
services.AddQuery<TQuery, TQueryResult, TQueryHandler>()
|
services.AddQuery<TQuery, TQueryResult, TQueryHandler>()
|
||||||
.AddFluentValidator<TQuery, TValidator>();
|
.AddFluentValidator<TQuery, TValidator>();
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
}
|
}
|
BIN
OpenHarbor.CQRS/.DS_Store
vendored
Normal file
BIN
OpenHarbor.CQRS/.DS_Store
vendored
Normal file
Binary file not shown.
@ -1,11 +1,29 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.1</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<PackageIconUrl>https://avatars.githubusercontent.com/u/52874619?v=4</PackageIconUrl>
|
<IsAotCompatible>true</IsAotCompatible>
|
||||||
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
<Authors>David Lebee, Mathias Beaulieu-Duncan</Authors>
|
||||||
<LangVersion>default</LangVersion>
|
<LangVersion>default</LangVersion>
|
||||||
|
<Company>Open Harbor</Company>
|
||||||
|
<PackageIcon>icon.png</PackageIcon>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<RepositoryUrl>https://git.openharbor.io/Open-Harbor/dotnet-cqrs</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
|
||||||
|
<DebugType>portable</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
|
<IncludeSource>true</IncludeSource>
|
||||||
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\icon.png" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
<None Include="..\README.md" Pack="true" PackagePath="" CopyToOutputDirectory="Always" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\OpenHarbor.CQRS.Abstractions\OpenHarbor.CQRS.Abstractions.csproj" />
|
<ProjectReference Include="..\OpenHarbor.CQRS.Abstractions\OpenHarbor.CQRS.Abstractions.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
45
README.md
45
README.md
@ -8,21 +8,21 @@ Our implementation of query and command responsibility segregation (CQRS).
|
|||||||
|
|
||||||
> Install nuget package to your awesome project.
|
> Install nuget package to your awesome project.
|
||||||
|
|
||||||
| Full Version | NuGet | NuGet Install |
|
| Package Name | NuGet | NuGet Install |
|
||||||
|-----------------------------------------| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |-----------------------------------------------------------------------:|
|
|-----------------------------------------| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |-----------------------------------------------------------------------:|
|
||||||
| OpenHarbor.CQRS | <a href="https://www.nuget.org/packages/OpenHarbor.CQRS/" target="_blank">[](https://www.nuget.org/packages/OpenHarbor.CQRS/)</a> | ```PM> Install-Package OpenHarbor.CQRS ``` |
|
| OpenHarbor.CQRS | [](https://www.nuget.org/packages/OpenHarbor.CQRS/) | ```dotnet add package OpenHarbor.CQRS ``` |
|
||||||
| OpenHarbor.CQRS.AspNetCore | <a href="https://www.nuget.org/packages/OpenHarbor.CQRS.AspNetCore/" target="_blank">[](https://www.nuget.org/packages/OpenHarbor.CQRS.AspNetCore/)</a> | ```PM> Install-Package OpenHarbor.CQRS.AspNetCore ``` |
|
| OpenHarbor.CQRS.AspNetCore | [](https://www.nuget.org/packages/OpenHarbor.CQRS.AspNetCore/) | ```dotnet add package OpenHarbor.CQRS.AspNetCore ``` |
|
||||||
| OpenHarbor.CQRS.FluentValidation | <a href="https://www.nuget.org/packages/OpenHarbor.CQRS.FluentValidation/" target="_blank">[](https://www.nuget.org/packages/OpenHarbor.CQRS.FluentValidation/)</a> | ```PM> Install-Package OpenHarbor.CQRS.FluentValidation ``` |
|
| OpenHarbor.CQRS.FluentValidation | [](https://www.nuget.org/packages/OpenHarbor.CQRS.FluentValidation/) | ```dotnet add package OpenHarbor.CQRS.FluentValidation ``` |
|
||||||
| OpenHarbor.CQRS.DynamicQuery | <a href="https://www.nuget.org/packages/OpenHarbor.CQRS.DynamicQuery/" target="_blank">[](https://www.nuget.org/packages/OpenHarbor.CQRS.DynamicQuery/)</a> | ```PM> Install-Package OpenHarbor.CQRS.DynamicQuery ``` |
|
| OpenHarbor.CQRS.DynamicQuery | [](https://www.nuget.org/packages/OpenHarbor.CQRS.DynamicQuery/) | ```dotnet add package OpenHarbor.CQRS.DynamicQuery ``` |
|
||||||
| OpenHarbor.CQRS.DynamicQuery.AspNetCore | <a href="https://www.nuget.org/packages/OpenHarbor.CQRS.DynamicQuery.AspNetCore/" target="_blank">[](https://www.nuget.org/packages/OpenHarbor.CQRS.DynamicQuery.AspNetCore/)</a> | ```PM> Install-Package OpenHarbor.CQRS.DynamicQuery.AspNetCore ``` |
|
| OpenHarbor.CQRS.DynamicQuery.AspNetCore | [](https://www.nuget.org/packages/OpenHarbor.CQRS.DynamicQuery.AspNetCore/) | ```dotnet add package OpenHarbor.CQRS.DynamicQuery.AspNetCore ``` |
|
||||||
|
|
||||||
> Abstractions Packages.
|
> Abstractions Packages.
|
||||||
|
|
||||||
| Full Version | NuGet | NuGet Install |
|
| Package Name | NuGet | NuGet Install |
|
||||||
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -----------------------------------------------------: |
|
| ---------------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -----------------------------------------------------: |
|
||||||
| OpenHarbor.CQRS.Abstractions | <a href="https://www.nuget.org/packages/OpenHarbor.CQRS.Abstractions/" target="_blank">[](https://www.nuget.org/packages/OpenHarbor.CQRS.Abstractions/)</a> | ```PM> Install-Package OpenHarbor.CQRS.Abstractions ``` |
|
| OpenHarbor.CQRS.Abstractions | [](https://www.nuget.org/packages/OpenHarbor.CQRS.Abstractions/) | ```dotnet add package OpenHarbor.CQRS.Abstractions ``` |
|
||||||
| OpenHarbor.CQRS.AspNetCore.Abstractions | <a href="https://www.nuget.org/packages/OpenHarbor.CQRS.AspNetCore.Abstractions/" target="_blank">[](https://www.nuget.org/packages/OpenHarbor.CQRS.AspNetCore.Abstractions/)</a> | ```PM> Install-Package OpenHarbor.CQRS.AspNetCore.Abstractions ``` |
|
| OpenHarbor.CQRS.AspNetCore.Abstractions | [](https://www.nuget.org/packages/OpenHarbor.CQRS.AspNetCore.Abstractions/) | ```dotnet add package OpenHarbor.CQRS.AspNetCore.Abstractions ``` |
|
||||||
| OpenHarbor.CQRS.DynamicQuery.Abstractions | <a href="https://www.nuget.org/packages/OpenHarbor.CQRS.DynamicQuery.Abstractions/" target="_blank">[](https://www.nuget.org/packages/OpenHarbor.CQRS.DynamicQuery.Abstractions/)</a> | ```PM> Install-Package OpenHarbor.CQRS.AspNetCore.Abstractions ``` |
|
| OpenHarbor.CQRS.DynamicQuery.Abstractions | [](https://www.nuget.org/packages/OpenHarbor.CQRS.DynamicQuery.Abstractions/) | ```dotnet add package OpenHarbor.CQRS.AspNetCore.Abstractions ``` |
|
||||||
|
|
||||||
|
|
||||||
## Sample of startup code for aspnetcore MVC
|
## Sample of startup code for aspnetcore MVC
|
||||||
@ -30,7 +30,7 @@ Our implementation of query and command responsibility segregation (CQRS).
|
|||||||
```csharp
|
```csharp
|
||||||
public void ConfigureServices(IServiceCollection services)
|
public void ConfigureServices(IServiceCollection services)
|
||||||
{
|
{
|
||||||
// make sure to add your queries and commands before the .AddPoweredSoftQueries and .AddPoweredSoftCommands
|
// make sure to add your queries and commands before configuring MvCBuilder with .AddOpenHarborCommands and .AddOpenHarborQueries
|
||||||
AddQueries(services);
|
AddQueries(services);
|
||||||
AddCommands(services);
|
AddCommands(services);
|
||||||
|
|
||||||
@ -63,11 +63,12 @@ private void AddQueries(IServiceCollection services)
|
|||||||
services.AddQuery<PersonQuery, IQueryable<Person>, PersonQueryHandler>();
|
services.AddQuery<PersonQuery, IQueryable<Person>, PersonQueryHandler>();
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
# Fluent Validation
|
# Fluent Validation
|
||||||
|
|
||||||
We use fluent validation in all of our projects, but we don't want it to be enforced.
|
We use fluent validation in all of our projects, but we don't want it to be enforced.
|
||||||
|
|
||||||
If you install. ```PoweredSoft.CQRS.FluentValidation``` you can use this way of registrating your commands.
|
If you install ```OpenHarbor.CQRS.FluentValidation``` you can use this way of registrating your commands.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public void ConfigureServices(IServiceCollection services)
|
public void ConfigureServices(IServiceCollection services)
|
||||||
@ -79,7 +80,19 @@ public void ConfigureServices(IServiceCollection services)
|
|||||||
|
|
||||||
public void ConfigureServices(IServiceCollection services)
|
public void ConfigureServices(IServiceCollection services)
|
||||||
{
|
{
|
||||||
// with PoweredSoft.CQRS.FluentValidation package.
|
// with OpenHarbor.CQRS.FluentValidation package.
|
||||||
services.AddCommandWithValidator<EchoCommand, string, EchoCommandHandler, EchoCommandValidator>();
|
services.AddCommand<EchoCommand, string, EchoCommandHandler, EchoCommandValidator>();
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# 2024 Roadmap
|
||||||
|
|
||||||
|
| Task | Description | Status |
|
||||||
|
|----------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|--------|
|
||||||
|
| Support .NET 8 | Ensure compatibility with .NET 8. | ✅ |
|
||||||
|
| Create a new demo project as an example | Develop a new demo project to serve as an example for users. | ⬜️ |
|
||||||
|
| New Independent Module for MVC | Develop a standalone module, independent of MVC, to enhance framework flexibility. | ⬜️ |
|
||||||
|
| Implement .NET Native Compilation (AOT) | Enable Ahead-of-Time (AOT) compilation support for .NET 8. | ⬜️ |
|
||||||
|
| Update FluentValidation | Upgrade FluentValidation to the latest version, addressing potential breaking changes. | ⬜️ |
|
||||||
|
| Create a website for the Framework | Develop a website to host comprehensive documentation for the framework. | ⬜️ |
|
||||||
|
| Re-add support for GraphQL | Re-integrate support for GraphQL, exploring lightweight solutions. | ⬜️ |
|
Loading…
Reference in New Issue
Block a user