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.
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.
Usando inyección de dependencias, es posible configurar el IHttpClientFactory con algunos parámetros fijos.
Así se reduce mucho el código del servicio.
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
Publicar un comentario