In ASP.NET MVC 5 è possibile ottenere alcune dipendenze tramite DependencyResolver.Current.GetService<T>()
. C'è qualcosa di simile in ASP.NET Core?ASP.NET Core DependencyResolver
risposta
credo che questo potrebbe essere un buon inizio:
Ecco documentazione ufficiale per l'iniezione di dipendenza per asp.net 5.
Dependency Injection è ora integrato in asp.net 5, ma siete liberi di utilizzare altri librerie come autofac. Quello predefinito sta funzionando bene per me.
Nella classe Starup, di avere un metodo come questo
public void ConfigureServices(IServiceCollection services)
{
//IServiceCollection acts like a container and you
//can register your classes like this:
services.AddTransient<IEmailSender, AuthMessageSender>();
services.Singleton<ISmsSender, AuthMessageSender>();
services.AddScoped<ICharacterRepository, CharacterRepository>();
}
Da:
Sì, c'è. In ASP.NET core 1.0.0, i servizi disponibili all'interno di una richiesta da parte HttpContext
sono esposti attraverso la raccolta [1] RequestServices:
this.HttpContext.RequestServices
È possibile utilizzare il metodo GetService per recuperare le dipendenze specificando il tipo della dipendenza:
this.HttpContext.RequestServices.GetService(typeof(ISomeService));
in generale, non si dovrebbe usare queste proprietà direttamente, preferendo invece di richiedere i tipi di vostre classi richiesti tramite il costruttore di vostra classe, e lasciando che il quadro iniettare queste dipendenze. Questo produce classi che sono più facili da testare e che sono più liberamente accoppiate.
[1] https://docs.asp.net/en/latest/fundamentals/dependency-injection.html#request-services
È stato rimosso in RC2 https://github.com/aspnet/Announcements/issues/118 – Vitaly
corretto, è stato reso disponibile su ASP.NET Core 1.0.0. Avrei dovuto menzionare la versione nella risposta per renderla più chiara. Grazie per averlo precisato. –
Non ci sono metodi di estensione per IServiceProvider: GetService, GetRequiredService e GetServices. Tutti hanno versioni generiche e non generiche. Nel progetto web Asp.Net Core è possibile ottenere riferimento a IServiceProvider tramite DI o da IApplicationBuilder. In Console app si dovrebbe creare la propria istanza di IServiceProvider e riferimento negozio da qualche parte
var services = new ServiceCollection();
...
ServiceProvider = services.BuildServiceProvider();
Se si ha realmente bisogno, è possibile scrivere proprio uno. Per prima cosa crea la classe AppDependencyResolver
.
public class AppDependencyResolver
{
private static AppDependencyResolver _resolver;
public static AppDependencyResolver Current
{
get
{
if (_resolver == null)
throw new Exception("AppDependencyResolver not initialized. You should initialize it in Startup class");
return _resolver;
}
}
public static void Init(IServiceProvider services)
{
_resolver = new AppDependencyResolver(services);
}
private readonly IServiceProvider _serviceProvider;
public object GetService(Type serviceType)
{
return _serviceProvider.GetService(serviceType);
}
public T GetService<T>()
{
return _serviceProvider.GetService<T>();
}
private AppDependencyResolver(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
}
prega di notare che _serviceProvider.GetService<T>();
disponibili solo se si aggiunge using Microsoft.Extensions.DependencyInjection;
. Tale spazio dei nomi sarà disponibile se aggiungi "Microsoft.Extensions.DependencyInjection": "1.0.0"
al numero project.json
. Rispondere al metodo Init
nella classe startup
. Per esempio
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
AppDependencyResolver.Init(app.ApplicationServices);
//all other code
Dopo di che si può usare ovunque, proprio come DependencyResolver.Current
. Ma il mio suggerimento - usalo solo se non è rimasta altra scelta.
Servizio disponibile in nucleo Asp.net, la sua all'interno HttpContext
this.HttpContext.RequestServices
Utilizzando questo servizio, è possibile ottenere il servizio.e inoltre è possibile utilizzare il metodo GetService per recuperare le dipendenze specificando il tipo di dipendenza:
this.HttpContext.RequestServices.GetService(typeof(ISomeService));
Il 'DependencyResolver.Current' è stato sostituito con l'astrazione IServiceProvider''. – Steven
OK. Ma c'è qualcosa come ServiceProvider.Current.GetService()? Voglio essere in grado di ottenere un servizio senza la necessità di iniettarlo. –
analyser
Non c'è, ed è davvero una buona cosa. Quello che stai cercando di fare è una cattiva pratica. – Steven