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
.