11

Ejemplo:¿Es apropiado usar Inyección de propiedades en una clase base cuando solo se requiere una dependencia en la clase base?

public abstract class BaseControler : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-) 
    public HomeController(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 
} 

Todos sabemos que tenemos que utilizar Constructor inyección cuando la dependencia es requería. Si se trata de una dependencia opcional, podemos usar Inyección de propiedad en su lugar.

Pero, ¿qué debe hacer cuando solo su clase base requiere la dependencia?

Cuando utilizaría Constructor Injection, en mi opinión, contaminaría todas las clases derivadas.

public abstract class BaseControler : Controller 
{ 
    readonly IUnitOfWork _unitOfWork; 

    public BaseControler(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-(
    public HomeController(IUserRepository userRepository, 
     IUnitOfWork unitOfWork) : base(unitOfWork) 
    { 
     _userRepository = userRepository; 
    } 
} 

¿Es approperiate utilizar inyección Propiedad en una clase base cuando una dependencia sólo se requiere en la clase base?

Respuesta

12

Usted no está contaminando la clase derivada. Está declarando explícitamente al consumidor que esta clase no puede funcionar sin esta dependencia.

Si la clase base requiere esta dependencia para funcionar correctamente, dado que la clase derivada deriva de esta clase base, implícitamente también requiere esta dependencia. Entonces el segundo ejemplo es la forma correcta. No debería usar la inyección de propiedad para algo que es una dependencia requerida.

+0

Veo su punto, pero el problema que obtendré son muchos parámetros de constructor. El punto es que las clases derivadas no están hablando directamente a la dependencia, en lugar de la clase base. Entonces, distinguiría entre llamadas directas a una dependencia y llamadas indirectas a una dependencia. – Rookian

+0

@Rookian, si te encuentras en una situación en la que tienes varios parámetros de constructor, podrías considerar crear un servicio que agregue esas dependencias y luego inyectar solo el servicio en el constructor. –

+5

+1 Favor de la composición sobre la herencia. Si se convierte en un problema con demasiados parámetros de constructor, culpe a su estrategia de herencia, no a la inyección de constructor. –

3

En realidad, su clase derivada ES una clase base. No hay algún otro objeto en alguna parte. Cuando pasa algo al constructor base, realmente inicializa el mismo objeto. Y eso se nota a los clientes lo que su instancia depende de:

Hay una instancia, que depende de dos cosas: repositorio de usuarios, y la unidad de trabajo. Call to base class constructor simplemente elimina la duplicación de inicialización de tus clases derivadas.

Cuestiones relacionadas