[英]Accessing logging functionality from a class library
我有一個包含兩個項目的解決方案,我的WPF應用程序項目引用了第二個項目,一個類庫。 WPF應用程序使用Caliburn.Micro。 我想庫中的一些類通過Caliburn.Micro的日志工具(我用log4net設置,但這應該是無關緊要的)記錄消息。
為了查看這是否有效,我將以下類放入我的庫中,以查看是否有任何內容會顯示在我的日志中,並從我的一個視圖模型中調用它:
public class TempClass {
private static ILog Log = LogManager.GetLog(typeof(TempClass));
public static void LogSomething(string something) {
Log.Info(something);
}
}
它沒用。
類庫無法引用我的WPF應用程序的項目,因為這會導致循環引用。
什么是這個問題的好方法?
編輯
一些可能有用的附加信息。 LogManager是Caliburn.Micro.DLL中的靜態類,並具有公共靜態GetLog字段:
public static Func<Type, ILog> GetLog = type => NullLogInstance;
在我的引導程序中,我正在設置它
LogManager.GetLog = type => new Log4netLogger(type);
如果我在Log4netLogger構造函數中設置斷點,則在調用GetLog()以在TempClass中獲取我的ILog實例時不會觸發它。
如果有幫助,這是Log4netLogger的實現:
internal class Log4netLogger : ILog {
private readonly log4net.ILog InnerLogger;
public Log4netLogger(Type type) {
InnerLogger = log4net.LogManager.GetLogger(type);
}
public void Error(Exception exception) {
InnerLogger.Error(exception.Message, exception);
}
public void Info(string format, params object[] args) {
InnerLogger.InfoFormat(format, args);
}
public void Warn(string format, params object[] args) {
InnerLogger.WarnFormat(format, args);
}
}
事實證明問題是使用字段初始化程序。 我相信這是在我的引導程序有機會將另一個委托分配給GetLog之前調用的。 以下是新的TempClass:
public class TempClass {
private static ILog Log;
public static void LogSomething(string something) {
if (Log == null)
Log = LogManager.GetLog(typeof(TempClass));
Log.Info(something);
}
}
您可以使用依賴注入來解決此問題: http : //msdn.microsoft.com/en-us/library/aa973811.aspx
(你也可以使用ServiceLocator: http : //www.martinfowler.com/articles/injection.html雖然,你會發現它的意見不一。有些人喜歡它,有人說服務定位器是邪惡的: http:// blog .ploeh.dk / 2010/02/03 / ServiceLocatorisanAnti點模式/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.