10

私はCastleWindsorにかなり慣れておらず、伐採施設の出入りを調べています。かなり印象的ですが、私が解決できない唯一のことは、WindsorがクラスのLoggerプロパティを設定する場所です。次のコードのように、クラスがまだセットアップされていない場合はLoggerをnullLoggerに設定しますが、Resolveの実行が終了すると、Loggerプロパティが設定されます。

private ILogger logger;

public ILogger Logger
{
    get
    {
        if (logger == null) 
            logger = NullLogger.Instance;
        return logger;
    }
    set { logger = value; }
}

だから私が疑問に思っているのは、ウィンザーが私のロガープロパティをどこでどのように設定するかです。

乾杯アンソニー

4

3 に答える 3

12

<facilities>ロガーは、構成のセクションにあるロギング機能によってセットアップされます。たとえば、log4netを使用するには、アプリまたはweb.configは次のようになります。

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/>
    </configSections>
<Configuration>

<castle>

    <facilities>
        <facility id="loggingfacility" 
             type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" 
             loggingApi="log4net" 
             configFile="logging.config" />
    </facilities>

</castle>
</configuration>
于 2008-10-29T01:20:21.097 に答える
11

これは、windsor を初期化するときに (たとえば、global.asax.cs から) プログラムで構成することもできます。

container.AddFacility("logging",  new LoggingFacility(LoggerImplementation.Log4net));

もちろん、任意のロガー実装を選択できます。

これは、ウィンザーがロガーを期待するクラスをインスタンス化するたびに配線されます。これは横断的な懸念事項であるため、コンストラクターには入れません。私の意見では、あなたが提案したようにする方がよいでしょう。少し単純化できます。

    private ILogger logger = NullLogger.Instance;
    public ILogger Logger
    {
        get { return logger; }
        set { logger = value; }
    }
于 2009-10-15T12:41:30.690 に答える
1

Setter を持つパブリック プロパティがあるため、Windsor からオブジェクトを解決するたびに、コンテナーから適切な値を使用してパブリック プロパティを設定しようとします (この場合、施設が Windsor に入力する ILogger)。

つまり、ウィンザーからクラスを解決すると、これが設定されます。ただし、 new Class() を実行する場合はそうではありません。

それは少なくとも私がそれを理解する方法です。

もう1つのアプローチは、コンストラクターを使用することです。つまり、名前付きのコンストラクターがある場合

public Class(ILogger logger) ILogger をパラメーターとしてインスタンス化されます。

例:

var yourClassObject = Kernel.Resolve<IClass>();

インターフェイス仕様がない (そしてそのように登録されていない) 場合、(インターフェイスではなく) その具象型を使用して解決したい場合は、コンポーネントを具象型として登録する必要があります。

于 2008-11-03T14:40:00.277 に答える