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