Acabo de pegar las 4 líneas al final de otro proyecto y funciona, pero recibo una advertencia ... Claramente no entiendo DI lo suficientemente bien ... ¿Qué quiere que cambie?
  public void ConfigureServices(IServiceCollection services)
        {
            if (HostingEnvironment.EnvironmentName == "Local")
            {
                services.AddHealthChecksUI()
               .AddHealthChecks()
               .AddCheck<TestWebApiControllerHealthCheck>("HomePageHealthCheck")
               .AddCheck<DatabaseHealthCheck>("DatabaseHealthCheck");
            }
        services.Configure<PwdrsSettings>(Configuration.GetSection("MySettings"));
        services.AddDbContext<PwdrsContext>(o => o.UseSqlServer(Configuration.GetConnectionString("PwdrsConnectionRoot")));
        services.AddMvc(o =>
        {
            o.Filters.Add<CustomExceptionFilter>();
        });
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy", b => b
                .SetIsOriginAllowed((host) => true)
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });
        services.AddSwaggerDocument();
        services.AddHttpContextAccessor();
        services.AddAutoMapper(typeof(ObjectMapperProfile));
        services.AddTransient<IEmailSender, EmailSender>();
        services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>));
        services.AddScoped(typeof(IAsyncRepository<>), typeof(Repository<>));
        services.AddScoped<IRfReportTypeRepository, RfReportTypeRepository>();
        services.AddScoped<IRfReportRepository, RfReportRepository>();
        services.AddScoped<IRfReportLookupsService, RfReportLookupsService>();
        services.AddScoped<IRfReportService, RfReportService>();
        services.Configure<RAFLogging>(Configuration.GetSection("RAFLogging"));
        ServiceProvider serviceProvider = services.BuildServiceProvider(); //WARNING IS HERE
        IOptions<RAFLogging> RAFLogger = serviceProvider.GetRequiredService<IOptions<RAFLogging>>();
        RegisterSerilogLogger logger = new RegisterSerilogLogger(RAFLogger);
    }
                    
                        c#
                                asp.net-core
                                dependency-injection
                                
                    
                    
                        punkouter
fuente
                
                fuente

WARNING IS HERE? Proporcione detalles sobre la advertencia. Muéstranos el texto de la advertencia. ¿Es esta una advertencia del compilador? ¿Una advertencia de algún complemento de análisis de código? ¿Si es así, Cuál? ¿Es esta una excepción de tiempo de ejecución? Muéstrenos todos los detalles relevantes de la excepción (mensaje, tipo, seguimiento de pila, excepciones internas).BuildServiceProvider(). Host debe invocar este método solo una vez. El proveedor de servicios duplicados puede provocar algunos errores inesperados.Respuestas:
Si se llama BuildServiceProvider () en ConfigureServices, se muestra la advertencia "Al llamar a 'BuildServiceProvider' desde el código de la aplicación, se crea una copia adicional de los servicios Singleton"
Resolví este problema:
Cree otra función (cuyo argumento pasado es IServiceCollection) y en la función llame a BuildServiceProvider ()
Por ejemplo, su código debería ser:
O use ApplicationServices de IApplicationBuilder. El tipo de ApplicationSerivces es IServiceProvider.
ACTUALIZADO :
Mencioné que esta solución es eliminar advertencia .
Creo que la versión correcta es usar la propiedad ApplicationServices de la aplicación, que es IApplicationBuilder en el parámetro del método Configure. El tipo de ApplicationServices es IServiceProvider.
fuente
El único propósito de llamar a 'BuildServiceProvider' es obtener una instancia de proveedor de servicios,
Para eliminar esta llamada y aún poder usar IServiceProvider, cambie el método Configure para obtenerlo como parámetro:
fuente