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));
- 1. Mancante DependencyResolver in System.Web.Http 5.2.2
- 2. @ Html.EnumDropDownListFor in Asp.net Core
- 3. Blocco ASP.Net Core SignInManagerOnFailure
- 4. Request.Files in ASP.NET CORE
- 5. ASP.NET Core 1.0 SynchronizationContext
- 6. Angular2 ASP.NET Core AntiForgeryToken
- 7. C'è Session.Abandon() asp.net Core
- 8. UserHostAddress in Asp.net Core
- 9. ASP.NET CORE 1.0, Impersonation
- 10. asp.net core development model
- 11. @ Html.Azione in Asp.Net Core
- 12. Differenza tra ASP.NET Core (.NET Core) e ASP.NET Core (.NET Framework)
- 13. DependencyResolver per richiesta in Web API
- 14. ASP.NET Core MVC Visualizza componenti
- 15. Computing SHA1 con ASP.NET Core
- 16. ASP.NET core "CreatedAtRoute" Il fallimento
- 17. Proprietà dell'iniezione in Asp.Net Core
- 18. Registrazione di ASP.NET Core 1.0
- 19. validatori password asp.net core mvc
- 20. Progetto ASP.NET Core 1.0 F #
- 21. Nessun intellisense in ASP.Net Core
- 22. Come creare un'autorizzazione personalizzata in ASP.NET Core (ASP.NET 5)
- 23. Framework di simulazione per asp.net core 5.0
- 24. Come riavviare programmaticamente l'app asp.net core?
- 25. Come abilitare ClientCache in ASP.NET Core
- 26. SQLite in ASP.NET Core con EntityFrameworkCore
- 27. Autenticazione token bearer in ASP.NET Core
- 28. Come utilizzare un'area in ASP.NET Core
- 29. ASP.Net Core 1.0 supporta progetti WebForm
- 30. Asp.net core Parametro MVC post sempre null
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