From 675bceca57d560547834dd0bc834e1a3049f3d57 Mon Sep 17 00:00:00 2001 From: Martin Costello Date: Wed, 3 Jun 2020 21:25:23 +0100 Subject: [PATCH] Reuse model binders (#22391) * Reuse model binders Reuse the same model binders for CancellationTokens and services, rather than allocating a new one for every request with such a parameter. --- .../Binders/CancellationTokenModelBinderProvider.cs | 6 +++++- .../src/ModelBinding/Binders/ServicesModelBinderProvider.cs | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/CancellationTokenModelBinderProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/CancellationTokenModelBinderProvider.cs index b3ee6f7361..6819805276 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/CancellationTokenModelBinderProvider.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/CancellationTokenModelBinderProvider.cs @@ -11,6 +11,10 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders /// public class CancellationTokenModelBinderProvider : IModelBinderProvider { + // CancellationTokenModelBinder does not have any state. Re-use the same instance for binding. + + private readonly CancellationTokenModelBinder _modelBinder = new CancellationTokenModelBinder(); + /// public IModelBinder GetBinder(ModelBinderProviderContext context) { @@ -21,7 +25,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders if (context.Metadata.ModelType == typeof(CancellationToken)) { - return new CancellationTokenModelBinder(); + return _modelBinder; } return null; diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/ServicesModelBinderProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/ServicesModelBinderProvider.cs index 2dea775a0a..b09d625c4d 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/ServicesModelBinderProvider.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/ServicesModelBinderProvider.cs @@ -10,6 +10,10 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders /// public class ServicesModelBinderProvider : IModelBinderProvider { + // ServicesModelBinder does not have any state. Re-use the same instance for binding. + + private readonly ServicesModelBinder _modelBinder = new ServicesModelBinder(); + /// public IModelBinder GetBinder(ModelBinderProviderContext context) { @@ -21,7 +25,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders if (context.BindingInfo.BindingSource != null && context.BindingInfo.BindingSource.CanAcceptDataFrom(BindingSource.Services)) { - return new ServicesModelBinder(); + return _modelBinder; } return null;