Nosabit.Application 1.2.5

dotnet add package Nosabit.Application --version 1.2.5
                    
NuGet\Install-Package Nosabit.Application -Version 1.2.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Nosabit.Application" Version="1.2.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Nosabit.Application" Version="1.2.5" />
                    
Directory.Packages.props
<PackageReference Include="Nosabit.Application" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Nosabit.Application --version 1.2.5
                    
#r "nuget: Nosabit.Application, 1.2.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=Nosabit.Application&version=1.2.5
                    
Install Nosabit.Application as a Cake Addin
#tool nuget:?package=Nosabit.Application&version=1.2.5
                    
Install Nosabit.Application as a Cake Tool

Nosabit.Application

Biblioteca de utilidades para la capa de aplicación en arquitecturas limpias o en capas. Proporciona herramientas para el registro automático de servicios mediante análisis de ensamblados, simplificando la configuración de la inyección de dependencias.

NuGet License: MIT

Instalación

Package Manager

Install-Package Nosabit.Application

.NET CLI

dotnet add package Nosabit.Application

Características principales

  • Registro automático de servicios: Detecta y registra servicios sin necesidad de configuración manual
  • Detección basada en convenciones: Identifica servicios por el sufijo "Service" en el nombre de la clase
  • Soporte para atributos personalizados: Permite marcar servicios con atributos para control preciso
  • Detección automática de interfaces: Vincula automáticamente clases con sus interfaces correspondientes
  • Control de ámbito de vida: Configura servicios como Scoped, Singleton o Transient
  • Integración con ASP.NET Core: Se integra perfectamente con el contenedor de IoC de ASP.NET Core

Uso básico

1. Definir el atributo de dependencia (opcional)

El paquete incluye un atributo para marcar servicios y especificar su tipo de inyección:

public enum TypeDependecyInjection
{
    Singleton,
    Scoped,
    Transient
}

[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class UseDependecyAttribute : Attribute
{
    public TypeDependecyInjection ServicesTypeDependecy { get; set; } = TypeDependecyInjection.Scoped;
    
    public UseDependecyAttribute(TypeDependecyInjection type = TypeDependecyInjection.Scoped)
    {
        ServicesTypeDependecy = type;
    }
}

2. Definir servicios en la capa de aplicación

Puedes definir servicios siguiendo la convención de nombres (*Service) o usando el atributo:

// Usando la convención de nombres (se registrará como Scoped por defecto)
public class ProductoService
{
    // Implementación...
}

// Usando el atributo para especificar el tipo de inyección
[UseDependecy(TypeDependecyInjection.Singleton)]
public class ConfiguracionService
{
    // Implementación...
}

// Con interfaz que sigue la convención de nombres (IProductoDescuentoService)
public interface IProductoDescuentoService
{
    // Definición de interfaz...
}

[UseDependecy(TypeDependecyInjection.Transient)]
public class ProductoDescuentoService : IProductoDescuentoService
{
    // Implementación...
}

3. Registrar todos los servicios automáticamente

En el método de configuración de servicios de tu aplicación:

// En Program.cs o Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    // Registrar todos los servicios del ensamblado de Application
    services.AddApplicationServicesFromAssembly(typeof(ProductoService).Assembly);
    
    // Resto de la configuración de servicios...
}

Funcionamiento detallado

El paquete proporciona un método de extensión AddApplicationServicesFromAssembly que:

  1. Escanea el ensamblado proporcionado en busca de clases que:

    • Tengan el atributo UseDependecyAttribute, o
    • Sean clases no abstractas con nombres que terminen en "Service"
  2. Para cada servicio encontrado:

    • Determina el tipo de dependencia (Scoped, Singleton o Transient)
    • Busca si el servicio tiene una interfaz que sigue la convención de nombres (I + NombreDeServicio)
    • Registra el servicio en el contenedor de IoC con la configuración adecuada
public static IServiceCollection AddApplicationServicesFromAssembly(
    this IServiceCollection Service, 
    Assembly assembly)
{
    var entityTypes = assembly.GetTypes()
        .Where(type => type.GetCustomAttribute<UseDependecyAttribute>() != null || 
                       (type.IsClass && !type.IsAbstract && type.Name.EndsWith("Service")))
        .ToList();
    
    entityTypes.ForEachEnumerable(entityType =>
    {
        var ServicesAttr = entityType.GetCustomAttribute<UseDependecyAttribute>();
        var typeDI = ServicesAttr?.ServicesTypeDependecy ?? TypeDependecyInjection.Scoped;
        
        var interfaceType = entityType.GetInterfaces()
            .FirstOrDefault(i => i.Name == "I" + entityType.Name);
        
        if (interfaceType == null)
        {
            if (typeDI == TypeDependecyInjection.Singleton)
                Service.AddSingleton(entityType);
            else if (typeDI == TypeDependecyInjection.Scoped)
                Service.AddScoped(entityType);
            else
                Service.AddTransient(entityType);
        }
        else
        {
            // Registrar con la interfaz encontrada
            if (typeDI == TypeDependecyInjection.Singleton)
                Service.AddSingleton(interfaceType, entityType);
            else if (typeDI == TypeDependecyInjection.Scoped)
                Service.AddScoped(interfaceType, entityType);
            else
                Service.AddTransient(interfaceType, entityType);
        }
    });
    
    return Service;
}

Casos de uso

Arquitectura limpia (Clean Architecture)

En una arquitectura limpia, puedes organizar tus servicios en la capa de aplicación:

MyApp/
├── MyApp.Domain/
│   └── Entities/
├── MyApp.Application/
│   ├── Services/
│   │   ├── ProductoService.cs
│   │   ├── IUsuarioService.cs
│   │   └── UsuarioService.cs
│   └── // ...
├── MyApp.Infrastructure/
└── MyApp.Api/
    └── Program.cs

Y luego registrarlos en el punto de entrada de la aplicación:

// En Program.cs
var builder = WebApplication.CreateBuilder(args);

// Registrar todos los servicios de aplicación
builder.Services.AddApplicationServicesFromAssembly(typeof(ProductoService).Assembly);

// Resto de la configuración...

Aplicaciones con múltiples módulos

Para aplicaciones más grandes con múltiples módulos, puedes registrar servicios de diferentes ensamblados:

// Registrar servicios del módulo principal
services.AddApplicationServicesFromAssembly(typeof(ProductoService).Assembly);

// Registrar servicios de un módulo adicional
services.AddApplicationServicesFromAssembly(typeof(ReportesService).Assembly);

Beneficios

  • Reduce el código repetitivo: Elimina la necesidad de registrar manualmente cada servicio
  • Minimiza errores: Evita olvidar registrar servicios o usar el ámbito incorrecto
  • Mejora el mantenimiento: Al agregar nuevos servicios, se registran automáticamente
  • Sigue principios SOLID: Facilita trabajar con interfaces y abstracciones
  • Código más limpio: Elimina largas secciones de registro de servicios

Integración con otros paquetes Nosabit

Este paquete está diseñado para trabajar con otros paquetes de la familia Nosabit:

Requisitos

  • .NET 6.0 o superior
  • Microsoft.AspNetCore.App

Licencia

Este proyecto está licenciado bajo la Licencia MIT.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.2.5 147 a month ago
1.2.1 149 a month ago
1.2.0 144 a month ago
1.0.0 153 a month ago