Come tutte le dipendenze che vengono registrate, anche con Scrutor è possibile definirne il lifetime delle istance che vengono create:
builder.Services.Scan(selector => selector
.FromAssemblyOf<ICustomerService>()
.AddClasses(classSelector =>
classSelector.AssignableTo<ICustomerService>())
.AsMatchingInterface()
.WithTransientLifetime()
); Nell’esempio precedente stiamo effettuando la scansione di tutto quello che è assegnabile a ICustomService. Al termine della scansione, aggiungiamo WithTransientLifetime in modo che la registrazione sia di tipo Transient. Ovviamente sono supportati anche gli altri tipi di di lifetime: WithSingletonLifetime() or WithScopedtLifetime().
Il meccanismo dello scan rappresenta un modo piuttosto elegante anche nell’utilizzo di generic. Suppiamo di lavorare ad un modello che utilizza un repositorygenerico:
public interface IRepository<T>
{
IEnumerable<T> Get();
}In questo caso l’injection avviene all’interno del repository nel formato
private readonly IRepository<User> _userRepository;
con la dichiarazione nel costruttore del controller
public UsersController(IRepository<User> userRepository)
Il repository viene quindi richiamato iniettato a partire da un definizione di parametro generico.
Nulla di particolarmente complicato per il caricamento dinamico:
builder.Services.Scan(selector => selector
.FromCallingAssembly()
.AddClasses(classSelector => classSelector.AssignableTo(typeof(IRepository<>)))
.AsImplementedInterfaces());il nostro selettore si basa sul caricamento dei tutti i tipi assegnabili IRepository (generico) che implementano l’interfaccia IRepository.
E’ possibile trovare la documentazione di Scrutor direttamente dal sito dello sviluppatore.