services net mvc iservicecollection ioptions inyeccion injection iconfiguration dependency dependencias configureservices asp c# asp.net-core inversion-of-control asp.net-core-mvc

c# - mvc - Cómo resolver instancias dentro de ConfigureServices en ASP.NET Core



iservicecollection (3)

¿Estás buscando algo como seguir? Puedes echar un vistazo a mis comentarios en el código:

// this call would new-up `AppSettings` type services.Configure<AppSettings>(appSettings => { // bind the newed-up type with the data from the configuration section ConfigurationBinder.Bind(appSettings, Configuration.GetConfigurationSection(nameof(AppSettings))); // modify these settings if you want to }); // your updated app settings should be available through DI now

¿Es posible resolver una instancia de IOptions<AppSettings> desde el método ConfigureServices en Startup? Normalmente puede usar IServiceProvider para inicializar instancias, pero no lo tiene en esta etapa cuando registra servicios.

public void ConfigureServices(IServiceCollection services) { services.Configure<AppSettings>( configuration.GetConfigurationSection(nameof(AppSettings))); // How can I resolve IOptions<AppSettings> here? }


La mejor manera de crear instancias de clases que dependen de otros servicios es usar la sobrecarga Agregar XXX que le proporciona el IServiceProvider . De esta manera, no necesita crear una instancia de un proveedor de servicios intermedios.

Los siguientes ejemplos muestran cómo puede usar esta sobrecarga en los métodos AddSingleton / AddTransient .

services.AddSingleton(serviceProvider => { var options = serviceProvider.GetService<IOptions<AppSettings>>(); var foo = new Foo(options); return foo ; }); services.AddTransient(serviceProvider => { var options = serviceProvider.GetService<IOptions<AppSettings>>(); var bar = new Bar(options); return bar; });


Puede crear un proveedor de servicios utilizando el método BuildServiceProvider() en IServiceCollection :

public void ConfigureService(IServiceCollection services) { // Configure the services services.AddTransient<IFooService, FooServiceImpl>(); services.Configure<AppSettings>(configuration.GetSection(nameof(AppSettings))); // Build an intermediate service provider var sp = services.BuildServiceProvider(); // Resolve the services from the service provider var fooService = sp.GetService<IFooService>(); var options = sp.GetService<IOptions<AppSettings>>(); }

Necesita el paquete Microsoft.Extensions.DependencyInjection para esto.

En el caso de que solo necesite vincular algunas opciones en ConfigureServices , también puede usar el método Bind :

var appSettings = new AppSettings(); configuration.GetSection(nameof(AppSettings)).Bind(appSettings);

Esta funcionalidad está disponible a través del paquete Microsoft.Extensions.Configuration.Binder .