Acabei de colar as 4 linhas no final de outro projeto e funciona, mas recebo um aviso .. Claramente não entendo o DI o suficiente ... O que ele quer que eu mude?
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
fonte
fonte
WARNING IS HERE
? Forneça detalhes sobre o aviso. Mostre-nos o texto do aviso. Este é um aviso do compilador? Um aviso de algum plug-in de análise de código? Se sim, qual? Isso é uma exceção de tempo de execução? Mostre-nos todos os detalhes relevantes da exceção (mensagem, tipo, rastreamento de pilha, exceções internas).BuildServiceProvider()
. Este método deve ser chamado pelo Host apenas uma vez. O provedor de serviços duplicado pode levar a alguns erros inesperados.Respostas:
Se chamado BuildServiceProvider () em ConfigureServices, o aviso mostrado "Chamando 'BuildServiceProvider' do código do aplicativo resulta em uma cópia adicional dos serviços Singleton sendo criados"
eu resolvi esse problema:
Crie outra função (que passou o argumento IServiceCollection) e chame a função BuildServiceProvider ()
Por exemplo, seu código deve ser:
Ou use ApplicationServices of IApplicationBuilder. O tipo de ApplicationSerivces é IServiceProvider.
ATUALIZADO :
Eu mencionei que esta solução é remover aviso .
Eu acho que a versão correta é usar a propriedade ApplicationServices do aplicativo, que é IApplicationBuilder no parâmetro do método Configure. O tipo de ApplicationServices é IServiceProvider.
fonte
O único objetivo de chamar 'BuildServiceProvider' é obter uma instância do provedor de serviços,
Para remover esta chamada e ainda poder usar o IServiceProvider, altere o método Configure para obtê-lo como parâmetro:
fonte