Ich habe gerade die 4 Zeilen am Ende eines anderen Projekts eingefügt und es funktioniert, aber ich bekomme eine Warnung. Ich verstehe DI eindeutig nicht gut genug. Was soll ich ändern?
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
quelle
quelle
WARNING IS HERE
? Bitte geben Sie Details zur Warnung an. Zeigen Sie uns den Text der Warnung. Ist das eine Compiler-Warnung? Eine Warnung von einem Code-Analyse-Plugin? Wenn ja, welches? Ist das eine Laufzeitausnahme? Zeigen Sie uns alle relevanten Details der Ausnahme (Nachricht, Typ, Stapelverfolgung, innere Ausnahmen).BuildServiceProvider()
. Diese Methode sollte vom Host nur einmal aufgerufen werden. Ein doppelter Dienstanbieter kann zu unerwarteten Fehlern führen.Antworten:
Wenn in ConfigureServices BuildServiceProvider () aufgerufen wird, wird die Warnung "Wenn Sie 'BuildServiceProvider' aus dem Anwendungscode aufrufen, wird eine zusätzliche Kopie der Singleton-Dienste erstellt."
Ich habe dieses Problem gelöst:
Erstellen Sie eine weitere Funktion (deren übergebenes Argument IServiceCollection ist) und rufen Sie den Funktionsaufruf BuildServiceProvider () auf.
Zum Beispiel sollte Ihr Code sein:
Oder verwenden Sie ApplicationServices von IApplicationBuilder. Der Typ von ApplicationSerivces ist IServiceProvider.
AKTUALISIERT :
Ich erwähnte, dass diese Lösung eine Warnung zum Entfernen ist .
Ich denke, die richtige Version besteht darin, die ApplicationServices-Eigenschaft der App zu verwenden. Diese App ist IApplicationBuilder im Parameter der Configure-Methode. Der Typ von ApplicationServices ist IServiceProvider.
quelle
Der EINZIGE Zweck des Aufrufs von 'BuildServiceProvider' besteht darin, eine Dienstanbieterinstanz abzurufen.
Ändern Sie die Configure- Methode, um diesen Aufruf zu entfernen und IServiceProvider weiterhin verwenden zu können , um ihn als Parameter abzurufen :
quelle