in Architettura Software, Informatica

Scrutor Generic e LifeTime

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.