Mis indispensables de C#. Parte 3: Configuraciones

Esta es una serie de 3 artículos cortos sobre características de C# que uso en todas mis aplicaciones.

Configurar el serializador de JSON


Cuando quiero usar la misma configuración en toda la aplicación, creo mi propio serializador. Este esquema me permitió migrar fácilmente desde Newtonsoft.Json a System.Text.Json. Reconocimiento especial al método ToHttpJsonContent()... parece que .NET 5 va a incluir extensiones al HttpClient que ayudan a eso.

using System.Net.Http;
using System.Text;
using System.Text.Json;

namespace MyApplication.Helpers
{
    public static class JsonGenerator
    {
        public static readonly JsonSerializerOptions serializerOptions = new JsonSerializerOptions
        {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase
        };

        public static readonly JsonSerializerOptions deserializerOptions = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true
        };

        public static string Serialize(object obj)
        {
            return JsonSerializer.Serialize(obj, serializerOptions);
        }

        public static StringContent ToHttpJsonContent(object obj)
        {
            return new StringContent(Serialize(obj), Encoding.UTF8, "application/json");
        }

        public static T Deserialize<T>(string content)
        {
            return string.IsNullOrWhiteSpace(content) ?
                default(T) :
                JsonSerializer.Deserialize<T>(content, deserializerOptions);
        }
    }
}

Configurar el cliente HTTP


Usando inyección de dependencias, es posible configurar el IHttpClientFactory con algunos parámetros fijos.

services.AddHttpClient("myClient", client =>
{
    client.BaseAddress = new Uri(Configuration["ConfigGroup:BaseUrl"]);
    client.DefaultRequestHeaders.Add("fn-key-header", Configuration["ConfigGroup:Key"]);
});

services.AddScoped<IMyService, MyService>();

Así se reduce mucho el código del servicio.

public class MyService : IMyService
{
    private readonly IHttpClientFactory _clientFactory;

    public MyService(IHttpClientFactory clientFactory)
    {
        _clientFactory = clientFactory;
    }

    public async Task<MyDTO> GetDTO(Guid id)
    {
        var client = _clientFactory.CreateClient("myClient");
        var response = await client.GetAsync($"/api/functionName/{id}");

        if (response.IsSuccessStatusCode)
        {
            var body = await response.Content.ReadAsStringAsync();
            var element = JsonGenerator.Deserialize<MyDTO>(body);
            return element;
        }

        return null;
    }
}

Comentarios

Entradas más populares de este blog

Ampliar el sistema de archivos de una máquina virtual Ubuntu

Adviento C# 2020: Diario de ASP.NET

C#: Registrar las dependencias de un módulo usando extensiones