Service Collection
ServiceCollectionExtensions
es una clase estática que proporciona métodos de extensión para la interfaz IServiceCollection
. Su propósito principal es facilitar la adición de servicios principales a una colección de servicios utilizando una configuración proporcionada.
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.
Escenarios de uso
Este método de extensión es particularmente útil en aplicaciones que:
- Siguen principios de diseño como DDD (Domain-Driven Design) o arquitectura hexagonal.
- Necesitan validar y enlazar configuraciones directamente desde el archivo de configuración.
- Requieren la integración de servicios básicos como
IDomainEventResolver
.
Beneficios
- Simplicidad: Reduce el código repetitivo para configurar servicios comunes.
- Validación integrada: Garantiza que la configuración cumple con las anotaciones de datos.
- Modularidad: Promueve una configuración limpia y centralizada de los servicios.
Ejemplo Práctico
El siguiente ejemplo práctico ilustra cómo utilizar la extensión AddCore
en una aplicación de consola. El objetivo es demostrar cómo cargar la configuración desde un archivo appsettings.json
, registrar los servicios en el contenedor de dependencias y resolver un tipo de evento de dominio.
// See https://aka.ms/new-console-template for more informationusing CodeDesignPlus.Net.Core.Abstractions;using CodeDesignPlus.Net.Core.Extensions;using CodeDesignPlus.Net.Core.Sample.Resources.DomainEvents;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;
Console.WriteLine("This is a sample of how to use the DomainEventResolverService.");
var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build();
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton(configuration);serviceCollection.AddCore(configuration);
var serviceProvider = serviceCollection.BuildServiceProvider();
var domainEventResolverService = serviceProvider.GetRequiredService<IDomainEventResolver>();
var type = domainEventResolverService.GetDomainEventType<OrderCreatedDomainEvent>();
Console.WriteLine(type.FullName);
Console.WriteLine("Press any key to exit...");
-
Carga de Configuración:
Utiliza ConfigurationBuilder para cargar la configuración desde un archivo JSON. Esto permite acceder a la configuración de la aplicación de manera estructurada.
var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build(); -
Creación de la Colección de Servicios:
Se crea una instancia de
ServiceCollection
, que actúa como el contenedor de dependencias.var services = new ServiceCollection(); -
Registro de Servicios:
Se llama a
AddCore
, lo que no solo agrega los servicios definidos, sino que también asegura que la configuración se valide.services.AddCore(configuration); -
Resolución de Servicios:
Se utiliza
GetRequiredService
para obtener una instancia delIDomainEventResolver
. Este servicio es clave para el manejo de eventos en la aplicación, permitiendo identificar y gestionar los eventos de dominio de manera efectiva.var domainEventResolverService = services.BuildServiceProvider().GetRequiredService<IDomainEventResolver>(); -
Salida de la Consola:
Se imprime el nombre completo del tipo de evento de dominio, demostrando que el servicio ha sido correctamente registrado y resuelto.
Console.WriteLine(domainEventResolverService.ResolveEvent(typeof(DomainEventSample)).FullName);
Métodos de extensión
ServiceCollectionExtensions
proporciona una serie de métodos de extensión que facilitan la adición de servicios a la colección de servicios en una aplicación. Estos métodos permiten una configuración más modular y organizada del contenedor de dependencias. A continuación se detallan algunos de los métodos principales:
AddCore
Type: public static IServiceCollection AddCore(this IServiceCollection services, IConfiguration configuration)
El método AddCore
agrega servicios esenciales a la colección de servicios. Estos servicios incluyen opciones de configuración, validación de configuración y servicios de resolución de eventos de dominio.
-
Parámetros
services
: Instancia deIServiceCollection
donde se registran los servicios.configuration
: Instancia deIConfiguration
para acceder a las configuraciones.
-
Retorno
Devuelve la misma instancia de
IServiceCollection
para permitir un encadenamiento fluido. -
Excepciones
ArgumentNullException
: Si services o configuration son nulos.CoreException
: Si la sección de configuración CoreOptions no existe.
Conclusiones
- Centralización de Configuración: La extensión AddCore simplifica la adición de servicios esenciales en la aplicación.
- Validación Robusta: Valida automáticamente las opciones configuradas.
- Facilidad de Uso: Su integración es sencilla y se adapta bien a arquitecturas modernas.