Se la nostra applicazione sfrutta Ninject e utilizza la tecnica della dependency injection, probabilmente ci troveremo nella situazione in cui, anche nell'ambito di un Hub di ASP.NET SignalR, abbiamo bisogno di iniettare le dipendenze tramite il costruttore:
public class CustomersHub : Hub { private ICustomerRepository _repository; public CustomersHub(ICustomerRepository repository) { if (repository == null) throw new ArgumentNullException("repository"); _repository = repository; } // ... }
In condizioni normali, questo Hub non è utilizzabile: ASP.NET SignalR, infatti, utilizza un dependency resolver simile a quello di ASP.NET MVC, che però per default non è configurato per sfruttare Ninject e quindi non è in grado di invocare il costruttore.
Dobbiamo quindi crearne uno personalizzato, che utilizzi questo container per risolvere la dipendenza da ICustomerRepository, e il modo più semplice è quello di creare una classe che erediti da DefaultDependencyResolver:
public class NinjectResolver : DefaultDependencyResolver { private IKernel _kernel; public NinjectResolver(IKernel kernel) { _kernel = kernel; } public override object GetService(Type serviceType) { var result = _kernel.TryGet(serviceType); if (result == null) return base.GetService(serviceType); return result; } public override IEnumerable<object> GetServices(Type serviceType) { var result = _kernel.GetAll(serviceType); return result.Union(base.GetServices(serviceType)); } }
L'idea di base è assolutamente simile al Dependency Resolver di ASP.NET MVC, ossia un oggetto che restituisca i componenti richiesti tramite i metodi GetService e GetServices. Andando nello specifico, l'implementazione che abbiamo realizzato sfrutta in prima istanza il kernel di Ninject per risolvere la dipendenza, sfruttando poi l'implementazione della classe base come fallback: è importante farlo perché comunque ASP.NET SignalR sfrutta questo resolver anche per costruire servizi interni di sistema, che non sono registrati su Ninject.
Per attivare questo resolver, è sufficiente specificarlo in fase di configurazione del routing:
public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); app.MapSignalR(new HubConfiguration() { Resolver = new NinjectResolver(NinjectWebCommon.Kernel) }); } }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Sfruttare lo streaming di una chiamata Http da Blazor
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Potenziare Azure AI Search con la ricerca vettoriale
Code scanning e advanced security con Azure DevOps
Evitare il flickering dei componenti nel prerender di Blazor 8
Load test di ASP.NET Core con k6
Copiare automaticamente le secret tra più repository di GitHub
Eseguire attività con Azure Container Jobs
I più letti di oggi
- Miglioramenti nelle performance di Angular 16
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- HTML5 con CSS e JavaScript
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzazione dei block template in Angular 17
- Disabilitare automaticamente un workflow di GitHub (parte 2)