當我注射記錄器時,我在生活方式問題上掙扎。如何使用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所期望的?
其他人如何處理這個問題?有沒有更好的辦法?
'NLog期望創建實例「每個依賴性實例」。你在哪裏讀到這個?據我所知,你的記錄員可以是單身人士。 – Steven
我的陳述可能有點生硬 - 我相信它可以用於任何一種方式。但我想使用「LogManager.GetCurrentClassLogger()」,它會自動獲取調用類和方法的名稱。如果記錄器是單身人士,則無法使用此功能。 (這可能是一個有效的妥協,取決於您的需求...) – freshr
'Logger'解決了這個問題。 –
Steven