4

log4netがNHと一緒に登場し、OR-Mapperに必須だった時代(それほど昔ではありませんが)を覚えています。現在は必須ではありませんが、オプションです。

これがNHibernateによってどのように達成されるのか本当に疑問に思います。誰かが一言で説明できれば、それは大歓迎です!

4

2 に答える 2

9

NHibernateには、以下のように定義されたロガーを作成するためのILoggerFactoryがあります。

public interface ILoggerFactory
    {
        IInternalLogger LoggerFor(string keyName);
        IInternalLogger LoggerFor(System.Type type);
    } 

IInternalLogger名前がまったく内部的ではないことを示すインターフェースは、実際のロガーインターフェースであり、当然のことながら、のインターフェースを正確にマップしILogますlog4net。NHは、ログを記録する必要がある場合、ロガーファクトリに内部的に問い合わせます。他のロガーが構成されておらず、log4netアセンブリが存在する場合、ファクトリはlog4netのラッパーを返します。独自のものを提供する場合は、ロガーファクトリを提供し、次のように構成する必要があります。

 <appSettings>
        <add key="nhibernate-logger" 
                  value="MyLoggingLoggerFactory, MyLoggingAssembly"/>
    </appSettings>

ご想像のとおり、クラスMyLoggingLoggerFactoryはを実装する必要がありますILoggerFactory。もちろん、返されたロガーはIInternalLogger、不幸な名前が誤解を招く可能性がある場合でも、前に述べたように公開されていることを実装する必要があります。これは、彼らがlog4net独立していたために使用する戦略です。さらに、ログがまったく必要ない場合は、デプロイディレクトリからlog4netアセンブリを削除するだけです。NHは正常に機能を低下させ、内部でnullロガーを使用します。

于 2012-06-13T13:37:56.287 に答える
1

NHibernateはlog4net.dllを参照しなくなりました。独自のロガー抽象化レイヤーがありますが、log4net用に設計された独自のロガー抽象化の実装が組み込まれています。

もちろん、log4netを使用するようにNHibernateを設定する場合、リフレクションを使用してCLRにlog4netアセンブリをロードさせることでこれを実現します。さらに興味がある場合は、お気に入りのリフレクターを使用してNHibernate.Log4NetLoggerおよびNHibernate.Log4NetLoggerFactoryを参照してください。

于 2012-06-13T13:41:56.563 に答える