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