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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
.