diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs index 24f86ce0b4..0f10652d8d 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs @@ -1,4 +1,5 @@ -using System; +using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Reflection; using Newtonsoft.Json; @@ -35,5 +36,13 @@ namespace Volo.Abp.Auditing return property; } + + private static readonly ConcurrentDictionary, AuditingContractResolver> AuditingContractResolverdDictionary = new ConcurrentDictionary, AuditingContractResolver>(); + + public static AuditingContractResolver GetSharedAuditingContractResolver(List ignoredTypes) + { + return AuditingContractResolverdDictionary.GetOrAdd(ignoredTypes, + x => new AuditingContractResolver(ignoredTypes)); + } } } diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs index 3862dd01da..931cdbbfad 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.Auditing { var options = new JsonSerializerSettings { - ContractResolver = new AuditingContractResolver(Options.IgnoredTypes) + ContractResolver = AuditingContractResolver.GetSharedAuditingContractResolver(Options.IgnoredTypes) }; return JsonConvert.SerializeObject(obj, options); diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs index 4114b89892..885382b335 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs @@ -18,6 +18,9 @@ namespace Volo.Abp.Http.Client.DynamicProxying protected IApiDescriptionCache Cache { get; } + private static readonly CamelCasePropertyNamesContractResolver SharedCamelCasePropertyNamesContractResolver = + new CamelCasePropertyNamesContractResolver(); + public ApiDescriptionFinder( IApiDescriptionCache cache, IDynamicProxyHttpClientFactory httpClientFactory) @@ -97,7 +100,7 @@ namespace Volo.Abp.Http.Client.DynamicProxying typeof(ApplicationApiDescriptionModel), new JsonSerializerSettings { - ContractResolver = new CamelCasePropertyNamesContractResolver() + ContractResolver = SharedCamelCasePropertyNamesContractResolver }); return (ApplicationApiDescriptionModel)result; diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/NewtonsoftJsonSerializer.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/NewtonsoftJsonSerializer.cs index 262c2b04d7..99252b8448 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/NewtonsoftJsonSerializer.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/NewtonsoftJsonSerializer.cs @@ -9,6 +9,9 @@ namespace Volo.Abp.Json.Newtonsoft { private readonly AbpJsonIsoDateTimeConverter _dateTimeConverter; + private static readonly CamelCaseExceptDictionaryKeysResolver SharedCamelCaseExceptDictionaryKeysResolver = + new CamelCaseExceptDictionaryKeysResolver(); + public NewtonsoftJsonSerializer(AbpJsonIsoDateTimeConverter dateTimeConverter) { _dateTimeConverter = dateTimeConverter; @@ -37,7 +40,7 @@ namespace Volo.Abp.Json.Newtonsoft if (camelCase) { - settings.ContractResolver = new CamelCaseExceptDictionaryKeysResolver(); + settings.ContractResolver = SharedCamelCaseExceptDictionaryKeysResolver; } if (indented) diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs index 325d67800d..78e16480b7 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using Microsoft.Extensions.Localization; @@ -9,6 +9,9 @@ namespace Volo.Abp.Localization.Json { public static class JsonLocalizationDictionaryBuilder { + private static readonly CamelCasePropertyNamesContractResolver SharedCamelCasePropertyNamesContractResolver = + new CamelCasePropertyNamesContractResolver(); + /// /// Builds an from given file. /// @@ -38,7 +41,7 @@ namespace Volo.Abp.Localization.Json jsonString, new JsonSerializerSettings { - ContractResolver = new CamelCasePropertyNamesContractResolver() + ContractResolver = SharedCamelCasePropertyNamesContractResolver }); } catch (JsonException ex) diff --git a/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreTestBase.cs b/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreTestBase.cs index 6bb82c3656..4d0dc01776 100644 --- a/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreTestBase.cs +++ b/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreTestBase.cs @@ -11,12 +11,15 @@ namespace Volo.Abp.AspNetCore public abstract class AbpAspNetCoreTestBase : AbpAspNetCoreIntegratedTestBase where TStartup : class { + private static readonly CamelCasePropertyNamesContractResolver SharedCamelCasePropertyNamesContractResolver = + new CamelCasePropertyNamesContractResolver(); + protected virtual async Task GetResponseAsObjectAsync(string url, HttpStatusCode expectedStatusCode = HttpStatusCode.OK) { var strResponse = await GetResponseAsStringAsync(url, expectedStatusCode); return JsonConvert.DeserializeObject(strResponse, new JsonSerializerSettings { - ContractResolver = new CamelCasePropertyNamesContractResolver() + ContractResolver = SharedCamelCasePropertyNamesContractResolver }); }