2017-03-23 48 views
0

當我注射記錄器時,我在生活方式問題上掙扎。如何使用Simple Injector配置NLog生活方式?

NLog期望創建「Instance per Dependency」實例,如此處所述 - https://simpleinjector.readthedocs.io/en/latest/lifetimes.html#instance-per-dependency

使用工廠方法LogManager.GetCurrentClassLogger()完成記錄器創建。使用這種模式允許記錄器獲取調用者的名字,以便將其包含在記錄的消息中。

簡單的注射器告訴我,我的瞬態記錄器不能注入到一個單身。但是我不能將生活方式改爲Singleton,因爲我會失去有關哪個班級正在調用記錄器的上下文信息。

我實現如下:

我寫了一個工廠,創建了NLOG實例,並在實現我自己的ILogger抽象的包裝返回它:

internal class LoggerFactory : ILoggerFactory 
{ 
    public ILogger GetLogger() 
    { 
     return new NLogLogger(LogManager.GetCurrentClassLogger()); 
    } 
} 

我用簡單的噴油器註冊了這個如此:

container.RegisterSingleton<ILoggerFactory, LoggerFactoryInstance>(); 
container.Register<ILogger>(
    () => container.GetInstance<ILoggerFactory>().GetLogger()); 

而且我在班級需要記錄取決於ILogger接口:

public class MyClass 
{ 
    private readonly ILogger _logger; 
    public MyClass(ILogger logger) 
    { 
     _logger = logger; 
    } 
} 

我必須注入工廠嗎?我寧願不必在任何地方解決記錄器的使用問題,但也許這就是Simple Injector所期望的?

其他人如何處理這個問題?有沒有更好的辦法?

+0

'NLog期望創建實例「每個依賴性實例」。你在哪裏讀到這個?據我所知,你的記錄員可以是單身人士。 – Steven

+0

我的陳述可能有點生硬 - 我相信它可以用於任何一種方式。但我想使用「LogManager.GetCurrentClassLogger()」,它會自動獲取調用類和方法的名稱。如果記錄器是單身人士,則無法使用此功能。 (這可能是一個有效的妥協,取決於您的需求...) – freshr

+0

'Logger '解決了這個問題。 – Steven

回答

2

您應該使用所述的基於上下文的注入。這意味着你創建一個通用的Logger<T>實施(理想your own defined)​​和使用需求的情況下進行註冊:在使用提供T

container.RegisterConditional(
    typeof(ILogger), 
    c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType), 
    Lifestyle.Singleton, 
    c => true); 

這種Logger<T>實施將呼叫轉發到NLOG:

public class Logger<T> : ILogger 
{ 
    private readonly NLogLogger logger = new NLogLogger(typeof(T)); 

    public void Log(LogEntry entry) 
    { 
     logger.Log(...); 
    } 
} 
+0

這是一個好主意。謝謝! – freshr

+0

我已經詳細瞭解了這一點,現在我不太確定。 'RegisterConditional'文檔說實例根據生活方式被緩存。這意味着我有很多記錄器實例緩存在內存中,具體取決於它們的使用位置。我有這個權利嗎? – freshr

+0

@freshr:由於'Logger '是通用的,因此將其註冊爲'Singleton'意味着每個關閉'T'只有一個實例。這也意味着每個消費者需要一個NLog記錄器。然而,如果你仔細想想,這是非常明顯的,不應該成爲一個問題。另外,如果你在你的系統中的許多類中注入了一個'ILogger',你[可能會做錯](https://stackoverflow.com/a/9915056/264697)。 – Steven

相關問題