簡體   English   中英

NLog自定義目標運行時依賴項

[英]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();
        } 
    } 
}

備注:

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM