Service Collection
Esta clase proporciona métodos de extensión para configurar e integrar fácilmente los servicios de Apache Kafka en una aplicación .NET utilizando IServiceCollection
. Facilita la configuración, validación y registro de los servicios necesarios para utilizar Kafka como mecanismo de mensajería.
using CodeDesignPlus.Net.Core.Extensions;
namespace CodeDesignPlus.Net.Kafka.Extensions;
/// <summary>/// Provides extension methods for adding Kafka services to the dependency injection container./// </summary>public static class ServiceCollectionExtensions{ /// <summary> /// Adds Kafka services to the specified IServiceCollection. /// </summary> /// <param name="services">The IServiceCollection to add the services to.</param> /// <param name="configuration">The configuration being bound.</param> /// <returns>The IServiceCollection so that additional calls can be chained.</returns> /// <exception cref="Exceptions.KafkaException">Thrown when the Kafka configuration section is missing.</exception> public static IServiceCollection AddKafka(this IServiceCollection services, IConfiguration configuration) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(configuration);
var section = configuration.GetSection(KafkaOptions.Section);
if (!section.Exists()) throw new Exceptions.KafkaException($"The section {KafkaOptions.Section} is required.");
services .AddOptions<KafkaOptions>() .Bind(section) .ValidateDataAnnotations();
var options = section.Get<KafkaOptions>();
if (options.Enable) { services.AddPubSub(configuration, x => { x.EnableDiagnostic = options.EnableDiagnostic; x.RegisterAutomaticHandlers = options.RegisterAutomaticHandlers; x.SecondsWaitQueue = options.SecondsWaitQueue; x.UseQueue = options.UseQueue; }); services.TryAddSingleton<IMessage, KafkaPubSub>(); services.TryAddSingleton<IKafkaPubSub, KafkaPubSub>();
services.TryAddSingleton(x => { var producerBuilder = new ProducerBuilder<string, IDomainEvent>(options.ProducerConfig);
producerBuilder.SetValueSerializer(new JsonSystemTextSerializer<IDomainEvent>());
return producerBuilder.BuildWithInstrumentation(); }); }
return services; }}
Dependencias y Requisitos Previos
Microsoft.Extensions.DependencyInjection
: Necesario para la interfazIServiceCollection
.Microsoft.Extensions.Configuration
: Necesario para la interfazIConfiguration
.Microsoft.Extensions.Options
: Necesario para la configuración de opciones.Confluent.Kafka
: Necesario para la interacción con Kafka.CodeDesignPlus.Net.PubSub
: Necesario para agregar los servicios de Pub/Sub.CodeDesignPlus.Net.Serialization
: Necesario para serializar los eventos.
Escenarios de uso
Este método de extensión es particularmente útil en aplicaciones que:
- Utilizan Kafka como plataforma de mensajería para la comunicación entre microservicios o componentes.
- Requieren alta escalabilidad y tolerancia a fallos en su sistema de mensajería.
- Buscan una forma sencilla y estandarizada de configurar Kafka a través de la configuración.
- Necesitan registrar automáticamente los handlers de mensajes para los eventos de dominio.
Beneficios
- Configuración Centralizada: Permite configurar Kafka a través del archivo
appsettings.json
, centralizando la configuración y facilitando su gestión. - Facilidad de Integración: Simplifica la incorporación de Kafka en la aplicación con una única llamada al método de extensión.
- Validación de Configuración: Valida automáticamente la configuración de Kafka al inicio de la aplicación, reduciendo errores en tiempo de ejecución.
- Registro de Servicios: Registra los servicios necesarios para el uso de Kafka, incluyendo el productor con configuración y serializador.
- Integración con Pub/Sub: Integra Kafka con un patrón pub/sub, permitiendo a los componentes de la aplicación suscribirse y publicar eventos.
Métodos de extensión
La clase ServiceCollectionExtensions
proporciona un único método de extensión para configurar Kafka en una aplicación .NET. Este método agrega los servicios necesarios para utilizar Kafka y valida la configuración de la aplicación.
AddKafka
Type: public static IServiceCollection AddKafka(this IServiceCollection services, IConfiguration configuration)
Agrega los servicios de Kafka al IServiceCollection
especificado.
-
Parámetros
services
: ElIServiceCollection
al que se agregarán los servicios.configuration
: La configuración utilizada para enlazar las opciones de Kafka.
-
Tipo de retorno
IServiceCollection
: ElIServiceCollection
modificado, permitiendo el encadenamiento de llamadas a otros métodos de configuración.
-
Excepciones
ArgumentNullException
: Se lanza siservices
oconfiguration
sonnull
.KafkaException
: Se lanza si la sección de configuraciónKafka
no existe.
-
Ejemplo de uso
var builder = WebApplication.CreateBuilder(args);builder.Services.AddKafka(builder.Configuration);
Conclusiones
El método de extensión AddKafka
es una herramienta esencial para simplificar la integración de Apache Kafka en aplicaciones .NET. Proporciona una forma clara y concisa de configurar y registrar los servicios necesarios, además de manejar la configuración a través del archivo appsettings.json
.