2016-06-14 77 views
5

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

+0

Il 'DependencyResolver.Current' è stato sostituito con l'astrazione IServiceProvider''. – Steven

+1

OK. Ma c'è qualcosa come ServiceProvider.Current.GetService ()? Voglio essere in grado di ottenere un servizio senza la necessità di iniettarlo. – analyser

+1

Non c'è, ed è davvero una buona cosa. Quello che stai cercando di fare è una cattiva pratica. – Steven

risposta

0

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:

DependencyResolver Asp.net 5.0

7

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

+1

È stato rimosso in RC2 https://github.com/aspnet/Announcements/issues/118 – Vitaly

+1

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. –

1

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(); 
4

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.

1

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));