Skip to content
This repository was archived by the owner on Nov 17, 2023. It is now read-only.

Commit fd76f39

Browse files
committed
Cache JsonSerializerOptions
According to dotnet/runtime#65396, using a new JsonSerializerOptions every time JsonSerializer is invoked is a suboptimal pattern. Fix this by caching JsonSerializerOptions instances.
1 parent 3169a93 commit fd76f39

File tree

10 files changed

+34
-52
lines changed

10 files changed

+34
-52
lines changed

src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderApiClient.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ public async Task<OrderData> GetOrderDraftFromBasketAsync(BasketData basket)
2323

2424
var ordersDraftResponse = await response.Content.ReadAsStringAsync();
2525

26-
return JsonSerializer.Deserialize<OrderData>(ordersDraftResponse, new JsonSerializerOptions
27-
{
28-
PropertyNameCaseInsensitive = true
29-
});
26+
return JsonSerializer.Deserialize<OrderData>(ordersDraftResponse, JsonHelper.CaseInsensitiveOptions);
3027
}
3128
}

src/ApiGateways/Web.Bff.Shopping/aggregator/Services/OrderApiClient.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ public async Task<OrderData> GetOrderDraftFromBasketAsync(BasketData basket)
2323

2424
var ordersDraftResponse = await response.Content.ReadAsStringAsync();
2525

26-
return JsonSerializer.Deserialize<OrderData>(ordersDraftResponse, new JsonSerializerOptions
27-
{
28-
PropertyNameCaseInsensitive = true
29-
});
26+
return JsonSerializer.Deserialize<OrderData>(ordersDraftResponse, JsonHelper.CaseInsensitiveOptions);
3027
}
3128
}

src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ public class EventBusRabbitMQ : IEventBus, IDisposable
55
{
66
const string BROKER_NAME = "eshop_event_bus";
77

8+
private static readonly JsonSerializerOptions s_indentedOptions = new() { WriteIndented = true };
9+
private static readonly JsonSerializerOptions s_caseInsensitiveOptions = new() { PropertyNameCaseInsensitive = true };
10+
811
private readonly IRabbitMQPersistentConnection _persistentConnection;
912
private readonly ILogger<EventBusRabbitMQ> _logger;
1013
private readonly IEventBusSubscriptionsManager _subsManager;
@@ -69,10 +72,7 @@ public void Publish(IntegrationEvent @event)
6972

7073
channel.ExchangeDeclare(exchange: BROKER_NAME, type: "direct");
7174

72-
var body = JsonSerializer.SerializeToUtf8Bytes(@event, @event.GetType(), new JsonSerializerOptions
73-
{
74-
WriteIndented = true
75-
});
75+
var body = JsonSerializer.SerializeToUtf8Bytes(@event, @event.GetType(), s_indentedOptions);
7676

7777
policy.Execute(() =>
7878
{
@@ -256,7 +256,7 @@ private async Task ProcessEvent(string eventName, string message)
256256
var handler = scope.ServiceProvider.GetService(subscription.HandlerType);
257257
if (handler == null) continue;
258258
var eventType = _subsManager.GetEventTypeByName(eventName);
259-
var integrationEvent = JsonSerializer.Deserialize(message, eventType, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
259+
var integrationEvent = JsonSerializer.Deserialize(message, eventType, s_caseInsensitiveOptions);
260260
var concreteType = typeof(IIntegrationEventHandler<>).MakeGenericType(eventType);
261261

262262
await Task.Yield();

src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEntry.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
public class IntegrationEventLogEntry
44
{
5+
private static readonly JsonSerializerOptions s_indentedOptions = new() { WriteIndented = true };
6+
private static readonly JsonSerializerOptions s_caseInsensitiveOptions = new() { PropertyNameCaseInsensitive = true };
7+
58
private IntegrationEventLogEntry() { }
69
public IntegrationEventLogEntry(IntegrationEvent @event, Guid transactionId)
710
{
811
EventId = @event.Id;
912
CreationTime = @event.CreationDate;
1013
EventTypeName = @event.GetType().FullName;
11-
Content = JsonSerializer.Serialize(@event, @event.GetType(), new JsonSerializerOptions
12-
{
13-
WriteIndented = true
14-
});
14+
Content = JsonSerializer.Serialize(@event, @event.GetType(), s_indentedOptions);
1515
State = EventStateEnum.NotPublished;
1616
TimesSent = 0;
1717
TransactionId = transactionId.ToString();
@@ -30,7 +30,7 @@ public IntegrationEventLogEntry(IntegrationEvent @event, Guid transactionId)
3030

3131
public IntegrationEventLogEntry DeserializeJsonContent(Type type)
3232
{
33-
IntegrationEvent = JsonSerializer.Deserialize(Content, type, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }) as IntegrationEvent;
33+
IntegrationEvent = JsonSerializer.Deserialize(Content, type, s_caseInsensitiveOptions) as IntegrationEvent;
3434
return this;
3535
}
3636
}

src/Services/Basket/Basket.API/Repositories/RedisBasketRepository.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,20 @@ public async Task<CustomerBasket> GetBasketAsync(string customerId)
3535
return null;
3636
}
3737

38-
return JsonSerializer.Deserialize<CustomerBasket>(data, new JsonSerializerOptions
39-
{
40-
PropertyNameCaseInsensitive = true
41-
});
38+
return JsonSerializer.Deserialize<CustomerBasket>(data, JsonHelper.CaseInsensitiveOptions);
4239
}
4340

4441
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket)
4542
{
46-
var created = await _database.StringSetAsync(basket.BuyerId, JsonSerializer.Serialize(basket));
43+
var created = await _database.StringSetAsync(basket.BuyerId, JsonSerializer.Serialize(basket, JsonHelper.CaseInsensitiveOptions));
4744

4845
if (!created)
4946
{
5047
_logger.LogInformation("Problem occur persisting the item.");
5148
return null;
5249
}
5350

54-
_logger.LogInformation("Basket item persisted succesfully.");
51+
_logger.LogInformation("Basket item persisted successfully.");
5552

5653
return await GetBasketAsync(basket.BuyerId);
5754
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Text.Json;
2+
3+
namespace Services.Common
4+
{
5+
public static class JsonHelper
6+
{
7+
public static readonly JsonSerializerOptions CaseInsensitiveOptions = new()
8+
{
9+
PropertyNameCaseInsensitive = true
10+
};
11+
}
12+
}

src/Web/WebMVC/Services/BasketService.cs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@ public async Task<Basket> GetBasket(ApplicationUser user)
2929
var responseString = await response.Content.ReadAsStringAsync();
3030
return string.IsNullOrEmpty(responseString) ?
3131
new Basket() { BuyerId = user.Id } :
32-
JsonSerializer.Deserialize<Basket>(responseString, new JsonSerializerOptions
33-
{
34-
PropertyNameCaseInsensitive = true
35-
});
32+
JsonSerializer.Deserialize<Basket>(responseString, JsonHelper.CaseInsensitiveOptions);
3633
}
3734

3835
public async Task<Basket> UpdateBasket(Basket basket)
@@ -82,10 +79,7 @@ public async Task<Basket> SetQuantities(ApplicationUser user, Dictionary<string,
8279

8380
var jsonResponse = await response.Content.ReadAsStringAsync();
8481

85-
return JsonSerializer.Deserialize<Basket>(jsonResponse, new JsonSerializerOptions
86-
{
87-
PropertyNameCaseInsensitive = true
88-
});
82+
return JsonSerializer.Deserialize<Basket>(jsonResponse, JsonHelper.CaseInsensitiveOptions);
8983
}
9084

9185
public async Task<Order> GetOrderDraft(string basketId)
@@ -94,10 +88,7 @@ public async Task<Order> GetOrderDraft(string basketId)
9488

9589
var responseString = await _apiClient.GetStringAsync(uri);
9690

97-
var response = JsonSerializer.Deserialize<Order>(responseString, new JsonSerializerOptions
98-
{
99-
PropertyNameCaseInsensitive = true
100-
});
91+
var response = JsonSerializer.Deserialize<Order>(responseString, JsonHelper.CaseInsensitiveOptions);
10192

10293
return response;
10394
}

src/Web/WebMVC/Services/CatalogService.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@ public async Task<Catalog> GetCatalogItems(int page, int take, int? brand, int?
2323

2424
var responseString = await _httpClient.GetStringAsync(uri);
2525

26-
var catalog = JsonSerializer.Deserialize<Catalog>(responseString, new JsonSerializerOptions
27-
{
28-
PropertyNameCaseInsensitive = true
29-
});
26+
var catalog = JsonSerializer.Deserialize<Catalog>(responseString, JsonHelper.CaseInsensitiveOptions);
3027

3128
return catalog;
3229
}

src/Web/WebMVC/Services/OrderingService.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@ async public Task<Order> GetOrder(ApplicationUser user, string id)
2323

2424
var responseString = await _httpClient.GetStringAsync(uri);
2525

26-
var response = JsonSerializer.Deserialize<Order>(responseString, new JsonSerializerOptions
27-
{
28-
PropertyNameCaseInsensitive = true
29-
});
26+
var response = JsonSerializer.Deserialize<Order>(responseString, JsonHelper.CaseInsensitiveOptions);
3027

3128
return response;
3229
}
@@ -37,10 +34,7 @@ async public Task<List<Order>> GetMyOrders(ApplicationUser user)
3734

3835
var responseString = await _httpClient.GetStringAsync(uri);
3936

40-
var response = JsonSerializer.Deserialize<List<Order>>(responseString, new JsonSerializerOptions
41-
{
42-
PropertyNameCaseInsensitive = true
43-
});
37+
var response = JsonSerializer.Deserialize<List<Order>>(responseString, JsonHelper.CaseInsensitiveOptions);
4438

4539
return response;
4640
}

src/Web/WebhookClient/Services/WebhooksClient.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@ public async Task<IEnumerable<WebhookResponse>> LoadWebhooks()
1414
var client = _httpClientFactory.CreateClient("GrantClient");
1515
var response = await client.GetAsync(_options.WebhooksUrl + "/api/v1/webhooks");
1616
var json = await response.Content.ReadAsStringAsync();
17-
var subscriptions = JsonSerializer.Deserialize<IEnumerable<WebhookResponse>>(json, new JsonSerializerOptions
18-
{
19-
PropertyNameCaseInsensitive = true
20-
});
17+
var subscriptions = JsonSerializer.Deserialize<IEnumerable<WebhookResponse>>(json, JsonHelper.CaseInsensitiveOptions);
2118
return subscriptions;
2219
}
2320
}

0 commit comments

Comments
 (0)