註冊NLog目標(具有依賴關係)我正在使用最新的NLog,ASP.NET Core,EF Core。使用ASP.NET Core的DI
我寫了通過EF保存自定義日誌目標:
public class MyEFTarget : TargetWithLayout
{
private readonly IMyContext _context;
public MyEFTarget(IMyContext context) : base()
{
_context = context;
}
protected override void Write(LogEventInfo logEvent)
{
// and so on...
}
}
我Startup
:
public void ConfigureServices(IServiceCollection services)
{
// register context with DI (as scoped)
services.AddDbContext<MyContext>(o => o.UseSqlite(config.GetConnectionString("Default")));
services.AddScoped<IMyContext, MyContext>();
// target depends on context, so must also be registered with DI
// I chose scoped so it's the same as the context
services.AddScoped<MyEFTarget>();
// ...and so on
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
{
// normal NLog config
env.ConfigureNLog("NLog.config");
loggerFactory.AddNLog();
app.AddNLogWeb();
// register target
Target.Register<MyEFTarget>("MyEFTarget");
// add target + rule programmatically
var target = serviceProvider.GetService<MyEFTarget>();
var rule = new LoggingRule("*", LogLevel.Info, target);
LogManager.Configuration.AddTarget("MyEFTarget", target); // problem is here ********
LogManager.Configuration.LoggingRules.Add(rule);
LogManager.ReconfigExistingLoggers();
// ...and so on
}
的問題是,NLOG緩存target
實例應用程序的時間...我假設?所以它基本上是一個單身人士。它保留了對我的EF上下文的引用,這可能會被處理。
有沒有更好的方法?
爲了一般地重申問題(因爲它不是EF問題),「我如何註冊/添加具有短暫依賴關係的自定義目標」?
您可以創建一個沖洗模式,沖洗時只開放數據庫連接。如果你可以在需要時注入IServiceProvider和'GetService()'。 –
@JoelHarkes連接由EF處理,我無法控制它。 – grokky
爲什麼你使用AddScoped如果你有services.AddDbContext? – Alexan