Saltar al contenido

Cómo usar la inyección de dependencia con herencia en C#

Nuestro equipo especializado pasados muchos días de investigación y de recopilar de información, dimos con los datos necesarios, esperamos que te resulte útil para tu proyecto.

Solución:

Después de algunos años de experiencia, encontré la Patrón decorador un ajuste perfecto para esto.

Implementación:

// Abstract type
public interface IRepository

    Add(T obj);


// Concete type
public class UserRepository : IRepository

    public UserRepository(/* Specific dependencies */) 

    Add(User obj)  /* [...] */ 


// Decorator
public class LoggingRepository : IRepository

    private readonly IRepository _inner;

    public LoggingRepository(IRepository inner) => _inner = inner;

    Add(T obj) 
    
        Console.Log($"Adding obj...");
        _inner.Add(obj);
        Console.Log($"obj addded.");
    

Uso:

// Done using the DI.
IRepositoty repository = 
    // Add as many decorators as you want.
    new LoggingRepository(
        new UserRepository(/* [...] */));

// And here is your add method wrapped with some logging :)
repository.Add(new User());

Este patrón es asombroso, porque puede encapsular comportamientos en clases separadas sin interrumpir los cambios y usarlos solo cuando realmente los necesita.

Como usted lo solicitó, aquí hay una muestra muy básica y cruda de cómo resolver este problema a través de la Composición en lugar de la herencia.

public class RepositoryService : IRepositoryService


    public RepositoryService (IServiceA serviceA, IServiceB serviceB) 
    
        /* ... */
    

    public void SomeMethod()
    
         


public abstract class Repository

    protected IRepositoryService repositoryService;

    public (IRepositoryService repositoryService)   
    
      this.repositoryService= repositoryService;
    

    public virtual void SomeMethod()
    
          this.repositoryService.SomeMethod()

          .
          .
    


public class ChildRepository1 : Repository


    public (IRepositoryService repositoryService)  : base (repositoryService)
    
    

    public override void SomeMethod()
    
          .
          .
    


public class ChildRepository2 : Repository


    public (IRepositoryService repositoryService, ISomeOtherService someotherService)   : base (repositoryService)
    
          .
          .
    

    public override void SomeMethod()
    
          .
          .
    

Ahora, la clase base abstracta y cada clase de repositorio secundario aquí solo dependerán de IRepositoryService o cualquier otra dependencia requerida (consulte ISomeOtherService en ChildRepository2).

De esta manera, el repositorio de su hijo solo proporciona IRepositoryService dependencia a su clase base y no necesita proporcionar las dependencias de IRepositoryService en cualquier sitio.

Si estás de acuerdo, puedes dejar una crónica acerca de qué le añadirías a esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *