2014-11-03 44 views
1

首先,我不確定我是否用好詞來形容我的問題,道歉(英文不是我的母親tong)。C#在構造函數參數中記錄「俄羅斯娃娃效應」

這是關於將記錄器添加到項目。 有人問,應該有幾個記錄器,他們應該被「動態」定義。 所以我們最終得到了具有Logger屬性的類。

所有的構造函數都有一個額外的參數,它是使用其他業務參數傳遞給構造函數的logger實例。當我們深入內部代碼時,對方內部的類使用相同的模式來傳遞logger實例。

當然有效,但我不滿意。 令我感到困擾的是記錄器不屬於業務邏輯。 也許和它沒有任何關係。

-

更準確地說這是我的工作出來的那一刻:

  • 還有就是​​接口定義伐木者功能(LogError(string msg)爲例)。不同的記錄器將實現這個接口。
  • 接口將由所有需要執行日誌記錄的類實現。該接口有一個屬性public ILogger LoggerPte

我用一個靜態類LoggerUtility[ThreadStatic]static ILogger CurrentLogger和功能:

public static void SetLoggerReference(ILoggable loggableClass) 
{ 
    loggableClass.LoggerPte = CurrentLogger; 
} 

爲loggable類之外,CurrentLogger定義。

爲loggable類的構造函數,我得叫LoggerUtility.SetLoggerReference(this);

如果發現這種方式更優雅,雖然它可能被扭曲,但我想知道它是否能有可能走得更遠。 ..

我剛開始閱讀關於自定義屬性,反射和AOP。有人可以給我一個關於如何使用像[Loggable]這樣的屬性來自動使構造函數在構造函數後調用函數SetLoggerReference(this)而不必明確寫入代碼中的方法。 如果有可能...

+0

看看PostSharp。他們有一個很好的解決方案,使用Aop – 2014-11-03 22:08:02

+0

[This](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)文章描述了一個靈活的設計,用於構建支持AOP的解決方案。 – qujck 2014-11-04 09:12:14

+1

PostSharp將是可以使用的東西,但這取決於我的團隊的決定。我正在尋找的是不可能的「裸」C#,這是一個答案。所以我想我會從qujck的文章中激發自己。感謝您的回答。 – 2014-12-02 09:57:59

回答

1

您是否聽說過依賴注入設計模式?您的原始解決方案是簡單的構造器注入。您的最終解決方案是Property注入,並且您的所有bussines對象都需要具有LoggerPte屬性。請看一些解決方案如何通過依賴注入容器來處理依賴注入和創建/創建業務對象(容器將爲您注入LoggerPte屬性,並且不需要在每個對象構造函數中調用您的靜態方法)。我正在使用Unity Container(微軟解決方案),但你可以找到很多其他的。

我希望這是你的需要。