Skip to content

Commit 9bb3b97

Browse files
authored
Merge pull request #42 from futurum-dev/feature/json-source-generator
System.Text.Json source generator
2 parents 3cfd70c + 2a204cc commit 9bb3b97

33 files changed

+239
-85
lines changed

benchmark/Futurum.WebApiEndpoint.Benchmark.MinimalApi/Program.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
using Futurum.WebApiEndpoint.Benchmark.MinimalApi;
44

5+
using Microsoft.AspNetCore.Http.Json;
6+
57
using Serilog;
68

79
Log.Logger = new LoggerConfiguration()
@@ -25,6 +27,11 @@
2527
// builder.Services.AddSwaggerGen();
2628

2729
builder.Services.AddAuthorization();
30+
31+
builder.Services.Configure<JsonOptions>(options =>
32+
{
33+
options.SerializerOptions.AddContext<WebApiEndpointJsonSerializerContext>();
34+
});
2835

2936
var application = builder.Build();
3037

benchmark/Futurum.WebApiEndpoint.Benchmark.MinimalApi/TestEndpoint.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Text.Json.Serialization;
2+
13
using FluentValidation;
24

35
using Microsoft.AspNetCore.Mvc;
@@ -27,4 +29,10 @@ public Validator()
2729
public record RequestDto(string? FirstName, string? LastName, int Age, IEnumerable<string>? PhoneNumbers);
2830

2931
public record ResponseDto(int Id, string? Name, int Age, string? PhoneNumber);
32+
}
33+
34+
[JsonSerializable(typeof(TestEndpoint.RequestDto))]
35+
[JsonSerializable(typeof(TestEndpoint.ResponseDto))]
36+
public partial class WebApiEndpointJsonSerializerContext : JsonSerializerContext
37+
{
3038
}

benchmark/Futurum.WebApiEndpoint.Benchmark.MvcController/Program.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,20 @@
2424

2525
// Add services to the container.
2626

27-
builder.Services.AddControllers();
27+
builder.Services.AddControllers()
28+
.AddJsonOptions(options =>
29+
{
30+
options.JsonSerializerOptions.AddContext<WebApiEndpointJsonSerializerContext>();
31+
});
32+
2833
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
2934
// builder.Services.AddEndpointsApiExplorer();
3035
// builder.Services.AddSwaggerGen();
3136

3237
builder.Services.AddAuthorization();
33-
38+
3439
var application = builder.Build();
35-
40+
3641
application.UseAuthorization();
3742

3843
// Configure the HTTP request pipeline.

benchmark/Futurum.WebApiEndpoint.Benchmark.MvcController/TestController.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Text.Json.Serialization;
2+
13
using FluentValidation;
24

35
using Microsoft.AspNetCore.Authorization;
@@ -37,4 +39,10 @@ public Validator()
3739
RuleFor(x => x.Age).GreaterThan(21).WithMessage("You must be at least 18 years old");
3840
RuleFor(x => x.PhoneNumbers).NotEmpty().WithMessage("Phone Number needed");
3941
}
42+
}
43+
44+
[JsonSerializable(typeof(RequestDto))]
45+
[JsonSerializable(typeof(ResponseDto))]
46+
public partial class WebApiEndpointJsonSerializerContext : JsonSerializerContext
47+
{
4048
}

benchmark/Futurum.WebApiEndpoint.Benchmark.WebApiEndpoint/ApiEndpointDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ public class ApiEndpointDefinition : IApiEndpointDefinition
77
public void Configure(ApiEndpointDefinitionBuilder definitionBuilder)
88
{
99
definitionBuilder.Web()
10-
.Command<TestWebApiEndpoint.ApiEndpoint>(builder => builder.Post("benchmark/{id}").Version(WebApiEndpointVersions.V1_0));
10+
.Command<TestWebApiEndpoint.ApiEndpoint>(builder => builder.Post("benchmark/{Id}").Version(WebApiEndpointVersions.V1_0));
1111
}
1212
}

benchmark/Futurum.WebApiEndpoint.Benchmark.WebApiEndpoint/Program.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
using System.Text.Json;
2+
13
using Futurum.Microsoft.Extensions.DependencyInjection;
24
using Futurum.WebApiEndpoint;
35
using Futurum.WebApiEndpoint.Benchmark.WebApiEndpoint;
6+
using Futurum.WebApiEndpoint.OpenApi;
7+
8+
using Microsoft.AspNetCore.Http.Json;
49

510
using Serilog;
611

@@ -21,19 +26,24 @@
2126

2227
builder.Host.ConfigureServices(serviceCollection => serviceCollection.RegisterModule(new WebApiEndpointModule(typeof(AssemblyHook).Assembly)));
2328

24-
// builder.Services.AddEndpointsApiExplorer();
25-
// builder.Services.AddSwaggerGen(options => options.EnableWebApiEndpointOpenApi("WebApiEndpoint Benchmark", WebApiEndpointVersions.V1_0));
29+
// builder.Services.EnableOpenApiForWebApiEndpoint();
30+
//
31+
// builder.Services.AddOpenApiVersion("WebApiEndpoint Benchmark", WebApiEndpointVersions.V1_0);
2632

2733
builder.Services.AddAuthorization();
34+
35+
builder.Services.Configure<JsonOptions>(options =>
36+
{
37+
options.SerializerOptions.AddContext<WebApiEndpointJsonSerializerContext>();
38+
});
2839

2940
var application = builder.Build();
3041

3142
application.UseAuthorization();
3243

3344
// if (application.Environment.IsDevelopment())
3445
// {
35-
// application.UseSwagger();
36-
// application.UseSwaggerUI(options => options.UseWebApiEndpointOpenApiUI("WebApiEndpoint Benchmark", WebApiEndpointVersions.V1_0));
46+
// application.UseOpenApiUIForWebApiEndpoint();
3747
// }
3848

3949
application.UseWebApiEndpoints();

benchmark/Futurum.WebApiEndpoint.Benchmark.WebApiEndpoint/TestWebApiEndpoint.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Text.Json.Serialization;
2+
13
using FluentValidation;
24

35
using Futurum.Core.Result;
@@ -7,16 +9,16 @@ namespace Futurum.WebApiEndpoint.Benchmark.WebApiEndpoint;
79

810
public static class TestWebApiEndpoint
911
{
10-
public record RequestDto(string? FirstName, string? LastName, int Age, IEnumerable<string>? PhoneNumbers)
12+
public record RequestDto(string FirstName, string LastName, int Age, IEnumerable<string> PhoneNumbers)
1113
{
1214
[MapFromPath("Id")] public int Id { get; set; }
1315
}
1416

15-
public record ResponseDto(int Id, string? Name, int Age, string? PhoneNumber);
17+
public record ResponseDto(int Id, string Name, int Age, string PhoneNumber);
1618

17-
public record Query(int Id, string? FirstName, string? LastName, int Age, IEnumerable<string>? PhoneNumbers);
19+
public record Query(int Id, string FirstName, string LastName, int Age, IEnumerable<string> PhoneNumbers);
1820

19-
public record Response(int Id, string? Name, int Age, string? PhoneNumber);
21+
public record Response(int Id, string Name, int Age, string PhoneNumber);
2022

2123
public class ApiEndpoint : CommandWebApiEndpoint.Request<RequestDto, Query>.Response<ResponseDto, Response>.Mapper<Mapper>
2224
{
@@ -43,4 +45,10 @@ public Validator()
4345
RuleFor(x => x.PhoneNumbers).NotEmpty().WithMessage("Phone Number needed");
4446
}
4547
}
48+
}
49+
50+
[JsonSerializable(typeof(TestWebApiEndpoint.RequestDto))]
51+
[JsonSerializable(typeof(TestWebApiEndpoint.ResponseDto))]
52+
public partial class WebApiEndpointJsonSerializerContext : JsonSerializerContext
53+
{
4654
}

sample/Futurum.WebApiEndpoint.Sample/Features/ApiEndpointDefinition.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Futurum.WebApiEndpoint.Sample.Features.CommandWithRequestUploadFiles;
1010
using Futurum.WebApiEndpoint.Sample.Features.CommandWithRequestUploadFileWithPayload;
1111
using Futurum.WebApiEndpoint.Sample.Features.Error;
12+
using Futurum.WebApiEndpoint.Sample.Features.JsonSourceGenerator;
1213
using Futurum.WebApiEndpoint.Sample.Features.QueryWithoutRequest;
1314
using Futurum.WebApiEndpoint.Sample.Features.QueryWithRequestManualParameter;
1415
using Futurum.WebApiEndpoint.Sample.Features.QueryWithRequestParameterMapFrom;
@@ -127,6 +128,8 @@ public void Configure(ApiEndpointDefinitionBuilder definitionBuilder)
127128

128129
.Command<ErrorResultScenario.ApiEndpoint>(builder => builder.Post("error-result"))
129130
.Command<ErrorExceptionScenario.ApiEndpoint>(builder => builder.Post("error-exception"))
131+
132+
.Command<CommandWithRequestWithoutResponseJsonSourceGeneratorScenario.ApiEndpoint>(builder => builder.Post("command-with-request-with-response-json-source-generator"))
130133
;
131134
}
132135
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System.Text.Json.Serialization;
2+
3+
using Futurum.Core.Result;
4+
using Futurum.WebApiEndpoint.Metadata;
5+
6+
namespace Futurum.WebApiEndpoint.Sample.Features.JsonSourceGenerator;
7+
8+
public static class CommandWithRequestWithoutResponseJsonSourceGeneratorScenario
9+
{
10+
public record CommandDto(string Id);
11+
12+
public record Command(string Id);
13+
14+
public record ResponseDto(string Id);
15+
16+
public record Response(string Id);
17+
18+
public class ApiEndpoint : CommandWebApiEndpoint.Request<CommandDto, Command>.Response<ResponseDto, Response>.Mapper<Mapper>
19+
{
20+
public override Task<Result<Response>> ExecuteAsync(Command request, CancellationToken cancellationToken) =>
21+
new Response(request.Id).ToResultOkAsync();
22+
}
23+
24+
public class Mapper : IWebApiEndpointRequestMapper<CommandDto, Command>,
25+
IWebApiEndpointResponseDtoMapper<Response, ResponseDto>
26+
{
27+
public Task<Result<Command>> MapAsync(HttpContext httpContext, MetadataDefinition metadataDefinition, CommandDto dto, CancellationToken cancellationToken) =>
28+
new Command(dto.Id).ToResultOkAsync();
29+
30+
public ResponseDto Map(Response domain) =>
31+
new(domain.Id);
32+
}
33+
}
34+
35+
[JsonSerializable(typeof(CommandWithRequestWithoutResponseJsonSourceGeneratorScenario.CommandDto))]
36+
[JsonSerializable(typeof(CommandWithRequestWithoutResponseJsonSourceGeneratorScenario.ResponseDto))]
37+
public partial class WebApiEndpointJsonSerializerContext : JsonSerializerContext
38+
{
39+
}

sample/Futurum.WebApiEndpoint.Sample/Program.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
using Futurum.WebApiEndpoint;
33
using Futurum.WebApiEndpoint.OpenApi;
44
using Futurum.WebApiEndpoint.Sample;
5+
using Futurum.WebApiEndpoint.Sample.Features.JsonSourceGenerator;
6+
7+
using Microsoft.AspNetCore.Http.Json;
58

69
using Serilog;
710

@@ -37,6 +40,11 @@
3740
builder.Services.AddWebApiEndpointAuthorization(typeof(AssemblyHook).Assembly);
3841
builder.Services.AddAuthenticationJwtBearer(builder.Configuration["Jwt:Issuer"], builder.Configuration["Jwt:Audience"], builder.Configuration["Jwt:Key"]);
3942

43+
builder.Services.Configure<JsonOptions>(options =>
44+
{
45+
options.SerializerOptions.AddContext<WebApiEndpointJsonSerializerContext>();
46+
});
47+
4048
var application = builder.Build();
4149

4250
application.UseAuthentication();

0 commit comments

Comments
 (0)