Pular para o conteúdo principal

DI - N Classes 1 Interface

DI - Injeção de Dependência

Obviamente, isso não é indicado pois viola o SOLID - Interface Segregation Principle (ISP) e também da SOLID - Liskov Substitution Principle (LSP).

public interface IRepository
{
public void Save();
}
public class RepositoryA : IRepository
{
public void Save() { /* codigo */ }
}
public class RepositoryB : IRepository
{
public void Save() { /* codigo */ }
}

No registro do container a gente vai criar uma função lambda que recebe um param e instancia um serviço que a gente indicar. Para resolver esse caso vamos fazer uso do service locator (que sabemos que é um anti-paternD.)

builder.Services.AddTransient<RepositoryA>();
builder.Services.AddTransient<RepositoryB>();
builder.Services.AddTransient<RepositoryC>();
builder.Services.AddTransient<Func<string, IRepository>>(serviceProvider => key =>
{
switch (key)
{
case "A":
return serviceProvider.GetRequiredService<RepositoryA>();
case "B":
return serviceProvider.GetRequiredService<RepositoryB>();
default:
return null;
}
}
);

Para acessar o repositório vamos usar uma function.

public class Controller
{
private readonly Func<string, IRepository> _serviceAccessor;

public Controller(Func<string, IRepository> serviceAccessor)
{
_serviceAccessor = serviceAccessor;
}

public void Metodo()
{
var repo = _serviceAccessor("A");// retornar RepositoryA
repo.Save();
}
}

Referências