2016-04-27 91 views
2

有一個LogManager類具有類型參數給log4net的是這樣的:我如何使用單類瞬態記錄器,簡單的噴油器

public class LogManager<T> : ILogManager 
{ 
    private ILog Logger { get; set; } 

    public LogManager() 
    { 
     Logger = LogManager.GetLogger(typeof(T)); 
    } 
} 

我註冊這個記錄作爲條件:

container.RegisterConditional(typeof(ILogManager), 
c => typeof(LogManager<>).MakeGenericType(c.Consumer.ImplementationType), 
Lifestyle.Transient, 
c => true); 

它的工作方式就像它應該的那樣,我將日誌管理器注入到控制器的構造器中並使用它。但有一個問題。我有很多應該使用日誌管理器的單例類,但我不能將它注入到它們中,因爲日誌管理器的壽命比其他日誌管理器短,所以簡單的注入器不會允許我這樣做。

建議的解決方案是向其他單例注入一個日誌工廠類並每次調用工廠,這聽起來像個壞主意。我不想做_logFactory.GetLogger()。調試(「日誌」)每次我想記錄一些東西。或者我錯過了這個解決方案的一些東西?

另一個建議的解決方案是使單態類暫態,這沒有任何意義。

任何建議我應該如何繼續?我的設計有什麼問題嗎?

+0

Sooo ...你爲什麼不把'LogManager '註冊爲單身人士? – Steven

+0

如果我這樣做,我失去了記錄的課程信息。 – gmnnn

+0

你測試過了嗎? Log4net的Logger類是線程安全的,每個'T'都會有它自己的'LogManager '實例。 – Steven

回答

3

應進行登記單:

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

由於LogManager<>是一個通用型,簡單的噴油器將創建每個封閉的仿製版本一個實例。所以LogManager<HomeController>是與LogManager<UsersController>不同的實例。這很簡單,因爲沒有辦法使用同一個實例(這在.NET中是不可能的)。因此,每個消費者仍將擁有自己的LogManager<T>以及其自己的log4net ILog實施。從log4net的LogManager.GetLogger返回的記錄器是線程安全的,這就是爲什麼它沒有問題,使自己的LogManager<T>單身。

+0

你很可靠,我對此有點困惑。擁有超過300個控制器意味着超過300個不同的記錄器實例不是一個問題嗎? – gmnnn

+0

@gmmm從內存消耗的角度來看,幾乎沒有問題,但是當您將記錄器注入這麼多類時,您絕對會遇到可維護性問題。請閱讀[這個答案](https://stackoverflow.com/a/9915056/264697) – Steven

+0

這是讓我思考的答案:)我會盡量簡化類。 – gmnnn

相關問題