¿Es posible resolver una instancia de IOptions<AppSettings>
desde el ConfigureServices
método en Inicio? Normalmente, puede usar IServiceProvider
para inicializar instancias, pero no lo tiene en esta etapa cuando está registrando servicios.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(
configuration.GetConfigurationSection(nameof(AppSettings)));
// How can I resolve IOptions<AppSettings> here?
}
c#
asp.net-core
inversion-of-control
asp.net-core-mvc
Muhammad Rehan Saeed
fuente
fuente
ConfigureServices
método.BuildServiceProvider
genera una advertencia si se usa en el código de la aplicación,ConfigureServices
ya que da como resultado una copia adicional de los servicios singleton creado. La respuesta de Ehsan Mirsaeedi aquí es la solución más ideal para casos como este.La mejor manera de crear instancias de clases que dependen de otros servicios es utilizar la sobrecarga Add XXX que le proporciona IServiceProvider . De esta forma, no es necesario crear una instancia de un proveedor de servicios intermedio.
Los siguientes ejemplos muestran cómo puede utilizar esta sobrecarga en los métodos AddSingleton / AddTransient .
fuente
La forma más sencilla y correcta de lograr esto, en todas las versiones de ASP.NET Core , es implementar la
IConfigureOptions<TOptions>
interfaz. Si bien esto ha existido desde .NET Core 1.0, parece que pocas personas saben cómo hace que las cosas funcionen simplemente .Como ejemplo, desea agregar un validador de modelo personalizado que dependa de uno de los otros servicios de su aplicación. Inicialmente parece imposible; no hay forma de resolverlo
IMyServiceDependency
porque no tiene acceso a unIServiceProvider
:Pero la "magia" de lo
IConfigureOptions<TOptions>
hace tan fácil:Esencialmente, cualquier configuración que hubiera hecho en los
Add***(***Options)
delegadosConfigureServices
ahora se mueve al método de suIConfigureOptions<TOptions>
claseConfigure
. Luego registra las opciones de la misma manera que registraría cualquier otro servicio, ¡y listo!Para obtener más detalles, así como información sobre cómo funciona esto detrás de escena, lo remito al siempre excelente Andrew Lock .
fuente
¿Estás buscando algo como seguir? Puedes echar un vistazo a mis comentarios en el código:
fuente
Quiere ayudar a otras personas que tienen el mismo aspecto pero que también usan Autofac.
Si desea obtener ILifetimeScope (es decir, un contenedor del alcance actual), debe llamar al
app.ApplicationServices.GetAutofacRoot()
método,Configure(IApplicationBuilder app)
esto devolverá la instancia de ILifetimeScope que puede usar para resolver los serviciosfuente