私は 2 つのプロジェクト、2 番目のプロジェクト、クラス ライブラリを参照する私の WPF アプリケーション プロジェクトのソリューションを持っています。WPF アプリケーションは Caliburn.Micro を使用します。ライブラリ内のいくつかのクラスで、Caliburn.Micro のログ機能 (log4net で設定しましたが、それは無関係である必要があります) を介してメッセージをログに記録したいと考えています。
これが機能するかどうかを確認するために、次のクラスをライブラリに配置して、ログに何かが表示されるかどうかを確認し、viewmodel の 1 つから呼び出しました。
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 内の静的クラスであり、public static GetLog フィールドがあります。
public static Func<Type, ILog> GetLog = type => NullLogInstance;
私のブートストラップでは、私はそれを
LogManager.GetLog = type => new Log4netLogger(type);
Log4netLogger コンストラクターにブレークポイントを設定すると、TempClass で ILog インスタンスを取得するために GetLog() 呼び出しが行われたときにヒットしません。
これが役立つ場合の 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);
}
}