我將盡可能最好地解釋我的情況,我希望它是有道理的。當EF遷移沒有經過Program.cs時,在Program.cs中配置依賴關係(例如日誌記錄)
我的項目是一個.NET核心Web API。有一個獨立的類庫項目,其中包含模型,包括我的DbContext的東西。
問題#1 我希望能夠記錄從內Startup.cs
理由安慰:我目前正在調試從環境變量設置的變量。我想輸出已設置爲控制檯的內容。
實施例:How do I write logs from within Startup.cs
現在,解決方案是ILoggerFactory Program.cs中添加到服務容器中,例如:
var host = new WebHostBuilder()
.UseKestrel()
.ConfigureServices(s => {
s.AddSingleton<IFormatter, LowercaseFormatter>();
})
.ConfigureLogging(f => f.AddConsole(LogLevel.Debug))
.UseStartup<Startup>()
.Build();
host.Run();
接下來,更改Startup.cs構造採取ILoggerFactory即會從我們剛剛註冊的容器中取出。如下:
public class Startup {
ILogger _logger;
IFormatter _formatter;
public Startup(ILoggerFactory loggerFactory, IFormatter formatter){
_logger = loggerFactory.CreateLogger<Startup>();
_formatter = formatter;
}
public void ConfigureServices(IServiceCollection services) {
_logger.LogDebug($"Total Services Initially: {services.Count}");
// register services
//services.AddSingleton<IFoo, Foo>();
}
public void Configure(IApplicationBuilder app, IFormatter formatter) {
// note: can request IFormatter here as well as via constructor
_logger.LogDebug("Configure() started...");
app.Run(async (context) => await context.Response.WriteAsync(_formatter.Format("Hi!")));
_logger.LogDebug("Configure() complete.");
}
這解決了我的問題 - 我可以運行應用程序,它現在工作正常,記錄我需要它的地方。
然而,
當我再嘗試運行的dotnet EF數據庫更新--startup項目= myAPIProject
現在失敗了,因爲EF沒有通過Program.cs中去,它,而不是試圖直接實例我啓動類。因爲現在我的構造函數需要一個ILoggerFactory,EF不知道該做什麼並拋出一個異常。
有沒有人知道解決這個問題的方法?
是的,你會看到ASP.NET Core 2.0移向這個模型,所以Startup中可以使用日誌記錄。另請參閱此處:https://ardalis.com/logging-and-using-services-in-startup-in-aspnet-core-apps – ssmith