Skip to content

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 interfaz IServiceCollection.
  • Microsoft.Extensions.Configuration: Necesario para la interfaz IConfiguration.
  • 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: El IServiceCollection al que se agregarán los servicios.
    • configuration: La configuración utilizada para enlazar las opciones de Kafka.
  • Tipo de retorno

    • IServiceCollection: El IServiceCollection modificado, permitiendo el encadenamiento de llamadas a otros métodos de configuración.
  • Excepciones

    • ArgumentNullException: Se lanza si services o configuration son null.
    • KafkaException: Se lanza si la sección de configuración Kafka 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.

Referencias