Browse Source

Update to GenHTTP 5 & .NET 5 (#6156)

* Update to GenHTTP 5 & .NET 5

* Remove ThreadPool directives
Andreas Nägeli 4 years ago
parent
commit
091d29b05d

+ 7 - 8
frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj

@@ -2,8 +2,8 @@
   
   <PropertyGroup>
     
-    <TargetFramework>netcoreapp3.1</TargetFramework>
-    <LangVersion>8.0</LangVersion>
+    <TargetFramework>net5.0</TargetFramework>
+    <LangVersion>9.0</LangVersion>
     
     <AssemblyTitle>GenHTTP Benchmarks</AssemblyTitle>
     <Description>Test suite to be executed with TechEmpower FrameworkBenchmarks.</Description>
@@ -12,7 +12,6 @@
     <OutputType>Exe</OutputType>
     
     <ServerGarbageCollection>true</ServerGarbageCollection>
-    <TieredCompilation>false</TieredCompilation>
     
   </PropertyGroup>
   
@@ -27,11 +26,11 @@
   </ItemGroup>
     
   <ItemGroup>
-    <PackageReference Include="GenHTTP.Core" Version="4.1.0" />
-    <PackageReference Include="GenHTTP.Modules.Scriban" Version="4.1.0" />
-    <PackageReference Include="GenHTTP.Modules.Webservices" Version="4.1.0" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.9" />
-    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
+    <PackageReference Include="GenHTTP.Core" Version="5.0.0" />
+    <PackageReference Include="GenHTTP.Modules.Razor" Version="5.0.0" />
+    <PackageReference Include="GenHTTP.Modules.Webservices" Version="5.0.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0" />
+    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.0" />
   </ItemGroup>
   
 </Project>

+ 15 - 2
frameworks/CSharp/genhttp/Benchmarks/Model/DatabaseContext.cs

@@ -7,18 +7,31 @@ namespace Benchmarks.Model
     {
         private static DbContextOptions<DatabaseContext> _Options;
 
+        private static DbContextOptions<DatabaseContext> _NoTrackingOptions;
+
         #region Factory
 
         public static DatabaseContext Create()
         {
-            return new DatabaseContext(_Options ??= GetOptions());
+            return new DatabaseContext(_Options ??= GetOptions(true));
         }
 
-        private static DbContextOptions<DatabaseContext> GetOptions()
+        public static DatabaseContext CreateNoTracking()
+        {
+            return new DatabaseContext(_NoTrackingOptions ??= GetOptions(false));
+        }
+
+        private static DbContextOptions<DatabaseContext> GetOptions(bool tracking)
         {
             var optionsBuilder = new DbContextOptionsBuilder<DatabaseContext>();
+            
             optionsBuilder.UseNpgsql("Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3");
 
+            if (!tracking)
+            {
+                optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
+            }
+
             return optionsBuilder.Options;
         }
 

+ 1 - 1
frameworks/CSharp/genhttp/Benchmarks/Model/Fortune.cs

@@ -10,7 +10,7 @@ namespace Benchmarks.Model
     {
 
         [Column("id")]
-        public int Id { get; set; }
+        public int ID { get; set; }
 
         [Column("message")]
         [StringLength(2048)]

+ 2 - 2
frameworks/CSharp/genhttp/Benchmarks/Program.cs

@@ -13,9 +13,9 @@ namespace Benchmarks
     {
 
         public static int Main(string[] args)
-        {
+        { 
             var tests = Layout.Create()
-                              .Add("plaintext", Content.From("Hello, World!"))
+                              .Add("plaintext", Content.From(Resource.FromString("Hello, World!")))
                               .Add("fortunes", new FortuneHandlerBuilder())
                               .AddService<JsonResource>("json")
                               .AddService<DbResource>("db")

+ 4 - 3
frameworks/CSharp/genhttp/Benchmarks/Resources/Fortunes.html

@@ -1,6 +1,7 @@
 <table>
     <tr><th>id</th><th>message</th></tr>
-    {{~ for cookie in cookies ~}}
-    <tr><td>{{cookie.id}}</td><td>{{cookie.message | html.escape}}</td></tr>
-    {{~ end ~}}
+    @foreach (var cookie in Model.Cookies)
+    {
+    <tr><td>@cookie.ID</td><td>@HttpUtility.HtmlEncode(cookie.Message)</td></tr>
+    }
 </table>

+ 2 - 2
frameworks/CSharp/genhttp/Benchmarks/Resources/Template.html

@@ -1,9 +1,9 @@
 <!DOCTYPE html>
 <html>
 <head>
-    <title>{{ meta.title }}</title>
+    <title>@Model.Meta.Title</title>
 </head>
 <body>
-    {{ content }}
+    @Model.Content
 </body>
 </html>

+ 2 - 2
frameworks/CSharp/genhttp/Benchmarks/Tests/CacheResource.cs

@@ -11,7 +11,7 @@ using Microsoft.Extensions.Caching.Memory;
 namespace Benchmarks.Tests
 {
 
-    public class CacheResource
+    public sealed class CacheResource
     {
         private static readonly Random _Random = new Random();
 
@@ -50,7 +50,7 @@ namespace Benchmarks.Tests
 
             var result = new List<World>(count);
 
-            using var context = DatabaseContext.Create();
+            using var context = DatabaseContext.CreateNoTracking();
 
             for (var i = 0; i < count; i++)
             {

+ 2 - 2
frameworks/CSharp/genhttp/Benchmarks/Tests/DbResource.cs

@@ -8,7 +8,7 @@ using Benchmarks.Model;
 namespace Benchmarks.Tests
 {
 
-    public class DbResource
+    public sealed class DbResource
     {
         private static Random _Random = new Random();
 
@@ -17,7 +17,7 @@ namespace Benchmarks.Tests
         {
             var id = _Random.Next(1, 10001);
 
-            using var context = DatabaseContext.Create();
+            using var context = DatabaseContext.CreateNoTracking();
 
             return context.World.First(w => w.Id == id);
         }

+ 29 - 25
frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs

@@ -1,12 +1,14 @@
 using System.Collections.Generic;
+using System.Threading.Tasks;
 using System.Linq;
+using System.Web;
 
 using GenHTTP.Api.Content;
 using GenHTTP.Api.Content.Templating;
 using GenHTTP.Api.Protocol;
 
 using GenHTTP.Modules.IO;
-using GenHTTP.Modules.Scriban;
+using GenHTTP.Modules.Razor;
 
 using Benchmarks.Model;
 
@@ -27,32 +29,32 @@ namespace Benchmarks.Tests
 
     #endregion
 
-    public class FortuneHandler : IHandler, IPageRenderer
-    {
+    #region Supporting data structures
 
-        #region Get-/Setters
+    public sealed class FortuneModel : PageModel
+    {
 
-        public IHandler Parent { get; }
+        public List<Fortune> Cookies { get; }
 
-        private IHandler Page { get; }
+        public FortuneModel(IRequest request, IHandler handler, List<Fortune> cookies) : base(request, handler)
+        {
+            Cookies = cookies;
+        }
 
-        private IRenderer<TemplateModel> Template { get; }
+    }
 
-        #endregion
+    #endregion
 
-        #region Supporting data structures
+    public class FortuneHandler : IHandler, IPageRenderer
+    {
 
-        public class FortuneModel : PageModel
-        {
+        #region Get-/Setters
 
-            public List<Fortune> Cookies { get; }
+        public IHandler Parent { get; }
 
-            public FortuneModel(IRequest request, IHandler handler, List<Fortune> cookies) : base(request, handler)
-            {
-                Cookies = cookies;
-            }
+        private IHandler Page { get; }
 
-        }
+        private IRenderer<TemplateModel> Template { get; }
 
         #endregion
 
@@ -62,31 +64,33 @@ namespace Benchmarks.Tests
         {
             Parent = parent;
 
-            Page = ModScriban.Page(Data.FromResource("Fortunes.html"), (r, h) => GetFortunes(r, h))
-                             .Title("Fortunes")
-                             .Build(this);
+            Page = ModRazor.Page(Resource.FromAssembly("Fortunes.html"), (r, h) => GetFortunes(r, h))
+                           .Title("Fortunes")
+                           .AddAssemblyReference<HttpUtility>()
+                           .AddUsing("System.Web")
+                           .Build(this);
 
-            Template = ModScriban.Template<TemplateModel>(Data.FromResource("Template.html")).Build();
+            Template = ModRazor.Template<TemplateModel>(Resource.FromAssembly("Template.html")).Build();
         }
 
         #endregion
 
         #region Functionality
 
-        public IResponse Handle(IRequest request) => Page.Handle(request);
+        public ValueTask<IResponse> HandleAsync(IRequest request) => Page.HandleAsync(request);
 
         public IEnumerable<ContentElement> GetContent(IRequest request) => Enumerable.Empty<ContentElement>();
 
-        public IResponseBuilder Render(TemplateModel model)
+        public async ValueTask<IResponseBuilder> RenderAsync(TemplateModel model)
         {
             return model.Request.Respond()
-                                .Content(Template.Render(model))
+                                .Content(await Template.RenderAsync(model))
                                 .Header("Content-Type", "text/html; charset=utf-8");
         }
 
         private FortuneModel GetFortunes(IRequest request, IHandler handler)
         {
-            using var context = DatabaseContext.Create();
+            using var context = DatabaseContext.CreateNoTracking();
 
             var fortunes = context.Fortune.ToList();
 

+ 2 - 2
frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs

@@ -3,14 +3,14 @@
 namespace Benchmarks.Tests
 {
 
-    public class JsonResult
+    public sealed class JsonResult
     {
 
         public string Message { get; set; }
 
     }
 
-    public class JsonResource
+    public sealed class JsonResource
     {
 
         [ResourceMethod]

+ 2 - 2
frameworks/CSharp/genhttp/Benchmarks/Tests/QueryResource.cs

@@ -9,7 +9,7 @@ using GenHTTP.Modules.Webservices;
 namespace Benchmarks.Tests
 {
 
-    public class QueryResource
+    public sealed class QueryResource
     {
         private static Random _Random = new Random();
 
@@ -28,7 +28,7 @@ namespace Benchmarks.Tests
 
             var result = new List<World>(count);
 
-            using var context = DatabaseContext.Create();
+            using var context = DatabaseContext.CreateNoTracking();
 
             for (int _ = 0; _ < count; _++)
             {

+ 6 - 4
frameworks/CSharp/genhttp/Benchmarks/Tests/UpdateResource.cs

@@ -1,13 +1,15 @@
-using Benchmarks.Model;
-using GenHTTP.Modules.Webservices;
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 
+using Benchmarks.Model;
+
+using GenHTTP.Modules.Webservices;
+
 namespace Benchmarks.Tests
 {
 
-    public class UpdateResource
+    public sealed class UpdateResource
     {
         private static Random _Random = new Random();
 

+ 3 - 3
frameworks/CSharp/genhttp/genhttp.dockerfile

@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine AS build
+FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build
 WORKDIR /source
 
 # copy csproj and restore as distinct layers
@@ -7,10 +7,10 @@ RUN dotnet restore -r linux-musl-x64
 
 # copy and publish app and libraries
 COPY Benchmarks/ .
-RUN dotnet publish -c release -o /app -r linux-musl-x64 --self-contained true --no-restore /p:PublishTrimmed=true /p:PublishReadyToRun=true
+RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore 
 
 # final stage/image
-FROM mcr.microsoft.com/dotnet/core/runtime-deps:3.1-alpine
+FROM mcr.microsoft.com/dotnet/runtime-deps:5.0-alpine
 WORKDIR /app
 COPY --from=build /app .