3

私は 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);
    }
}
4

2 に答える 2

1

この問題を解決するには、依存性注入を使用できます: http://msdn.microsoft.com/en-us/library/aa973811.aspx

(ServiceLocator を使用することもできます: http://www.martinfowler.com/articles/injection.htmlですが、それについてはさまざまな意見があります。それを好む人もいれば、Service Locator は悪だと言う人もいます: http://blog .ploeh.dk/2010/02/03/ServiceLocatorisanアンチパターン/

于 2013-08-20T22:40:03.040 に答える