NLog自定义目标运行时依赖项



问题:我的数据库逻辑放在一些大的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();
} 
} 
}

备注:

  1. 我不想使用标准的数据库目标,因为在这种情况下,我需要支持两个配置,并且数据库工作逻辑将位于不同的位置
  2. 当前版本在此位置存在瓶颈:
if (_db == null) { _db = new DataBaseObject(ConnectionString); }

因为DataBaseObject真的很大。

  1. 我读过一些关于依赖注入的文章,但这种技术会导致一些包依赖性。这意味着有更多的地方一切都可能崩溃

您可以使用GlobalDiagnosticsContext来存储IDataBaseObject并在目标中使用它。

代码中的某个位置:

GlobalDiagnosticsContext.Set("key1", myDbObject);

并在你的目标中读取:

var myDbObject = GlobalDiagnosticsContext.GetObject("key1");

注意:如果您需要一个有限的范围,您也可以使用MappedDiagnosticsContext(每个线程的范围(或MappedDiagnosticsLogicalContext(每个螺纹的范围,包括异步Tasks(

最新更新