[英]NLog custom target runtime dependency
問題:我的數據庫邏輯放在一些大的DataBaseObject
。 它包含方法,連接字符串以及該邏輯層所需的一切。 如何在運行時將其放入NLog自定義目標中?
這幾乎可以正常工作(請參見備注):
using NLog;
using NLog.Config;
using NLog.Targets;
using Data.Base.Object.Namespace;
namespace MyNamespace
{
[Target("DatabaseLog")]
public sealed class DatabaseLogTarget: TargetWithLayout
{
private IDataBaseObject _db;
public DatabaseLogTarget()
{
}
[RequiredParameter]
public string ConnectionString { get; set; }
protected override void Write(LogEventInfo logEvent)
{
Save(logEvent);
}
private void Save(LogEventInfo logEvent)
{
if (_db == null) { _db = new DataBaseObject(ConnectionString); }
_db.Log();
}
}
}
這不起作用,但是我需要:
using NLog;
using NLog.Config;
using NLog.Targets;
using Data.Base.Object.Namespace;
namespace MyNamespace
{
[Target("DatabaseLog")]
public sealed class DatabaseLogTarget: TargetWithLayout
{
private IDataBaseObject _db;
public DatabaseLogTarget(IDataBaseObject db)
{
_db = db;
}
protected override void Write(LogEventInfo logEvent)
{
Save(logEvent);
}
private void Save(LogEventInfo logEvent)
{
_db.Log();
}
}
}
備注:
if (_db == null) { _db = new DataBaseObject(ConnectionString); }
...因為DataBaseObject確實很大。
您可以使用GlobalDiagnosticsContext來存儲IDataBaseObject
並在目標中使用它。
在代碼中的某處:
GlobalDiagnosticsContext.Set("key1", myDbObject);
並在目標中閱讀它:
var myDbObject = GlobalDiagnosticsContext.GetObject("key1");
注意:如果需要有限的作用域,則還可以使用MappedDiagnosticsContext (每個線程范圍)或MappedDiagnosticsLogicalContext (每個線程范圍,包括異步Tasks
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.