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.