2

.NET での Dependency Injectionの中で、著者は、Spring.NET はカスタム オブジェクトの有効期間の作成をサポートしていないと述べています (セクション 12.2 [有効期間の管理] の最後の段落を参照)。

私はフレームワークに慣れていませんが、そうではないかもしれないと思います。これまでの調査に基づいて、ITargetSource インターフェイスを実装することでカスタム ライフタイムを定義できると思いますが、おそらく、このインターフェイスはそれ以上のことを行うことができます (定義済みの実装には、オブジェクト プーリングやホットスワップ可能なターゲットなどが含まれるなど)。

私の理解は正しいですか?はいの場合、カスタム ライフタイムを作成および構成するための正確な論理手順は何ですか? いいえの場合、Spring.NET でカスタム オブジェクトの有効期間を作成するにはどうすればよいですか?

4

1 に答える 1

3

わかりましたので、実際にここで別の質問をしましたが、その過程でこの質問に答えたようです (これは、自分で投稿した 1 つの回答で 2 つの質問に答えるというまれな機会の 1 つです)。この別の質問に従えば、Spring.NET でカスタム ライフ タイムを定義することが実際に可能であることがわかります。

要約すると、Spring.NET のカスタム ライフタイムは、ITargetSource インターフェースを実装することで作成できますが、おそらく、それは微妙なインターフェースであり、ターゲットの作成に関する手の込んだことを行うために使用できます。以下を含む (ただし、これらに限定されません) 利用可能な実装は既にいくつかあります。

  • SingletonTargetSource (シングルトンの有効期間を提供)
  • PrototypeTargetSource (一時的な有効期間を提供します)
  • ThreadLocalTargetSource (スレッドスコープの有効期間を提供)
  • SimplePoolTargetSource (オブジェクト プーリングを提供)
  • HotSwappableTargetSource (実行時にターゲットをスワップする機能を提供します)

興味深いことに、オブジェクトにライフタイムを適用する方法は、必要なライフタイムによって大きく異なります。Spring.NET のすべてのオブジェクトは、デフォルトでシングルトンです。オブジェクトをプロトタイプとして指定するには (Spring.NET は一時的なものです)、次のように singleton="false" を設定します。

<object id="..." type="..." singleton="false"/>

残念ながら、提供された残りのライフタイム (カスタム実装を含む) には、このような便利なプロパティはありません。では、スレッド ローカル スコープでオブジェクトを構成するとします。ProxyFactoryObject を使用してこれを行う方法は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net">
    <object id="ConsoleLoggingBeforeAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor">
        <property name="Advice">
            <object type="Spring.Examples.AopQuickStart.ConsoleLoggingBeforeAdvice"/>
        </property>
    </object>

    <object id="ServiceCommandTargetSource" type="Spring.Aop.Target.ThreadLocalTargetSource">
        <property name="TargetObjectName" value="ServiceCommandTarget"/>
    </object>

    <object id="ServiceCommandTarget" type="Spring.Examples.AopQuickStart.ServiceCommand" singleton="false"/>

    <object name="ServiceCommand" type="Spring.Aop.Framework.ProxyFactoryObject">
        <property name="TargetSource" ref="ServiceCommandTargetSource"/>
        <property name="InterceptorNames">
            <list>
                <value>ConsoleLoggingBeforeAdvisor</value>
            </list>
        </property>
    </object>
</objects>

繰り返しますが、上記の構成とまったく同じ結果を達成したいが、DefaultAdvisorAutoProxyCreator を使用する場合は、ITargetSourceCreator インターフェイスを実装するカスタム タイプを実装するなど、まったく異なる方法で実行する必要があります。

以下は、ThreadLocalTargetSourceCreator を作成する必要最小限の ITargetSourceCreator 実装です。

namespace Spring.Examples.AopQuickStart {
    public class ThreadLocalTargetSourceCreator : AbstractPrototypeTargetSourceCreator, ITargetSourceCreator {
        private readonly ThreadLocalTargetSource _threadLocalTargetSource;

        public ThreadLocalTargetSourceCreator() {
            _threadLocalTargetSource = new ThreadLocalTargetSource();
        }

        protected override AbstractPrototypeTargetSource CreatePrototypeTargetSource(Type objectType, string name, IObjectFactory factory) {
            return _threadLocalTargetSource;
        }
    }
}

最後に、次の構成を使用して、上記の ITargetSourceCreator を DefaultAdvisorAutoProxyCreator と共に使用し、スレッド ローカル スコープでターゲット タイプのインスタンスを作成する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net" default-autowire="constructor">
    <object id="ConsoleLoggingBeforeAdvice" type="Spring.Aop.Support.DefaultPointcutAdvisor">
        <property name="Advice">
            <object type="Spring.Examples.AopQuickStart.ConsoleLoggingBeforeAdvice" />
        </property>
    </object>

    <object id="ServiceCommand" type="Spring.Examples.AopQuickStart.ServiceCommand" singleton="false"/>

    <object type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator">
        <property name="CustomTargetSourceCreators">
            <list element-type="Spring.Aop.Framework.AutoProxy.ITargetSourceCreator">
                <object type="Spring.Examples.AopQuickStart.ThreadLocalTargetSourceCreator"/>
            </list>
        </property>
    </object>
</objects>

私の意見では、シングルトン (デフォルト) とプロトタイプ以外のライフタイムを構成する方法はやや直感的ではなく、さまざまなタイプのプロキシ ファクトリ実装 (ProxyFactoryObject と DefaultAdvisorAutoProxyCreator) 間で確実に合理化されていません。

要約すると、はい、Spring.NET はカスタム ライフタイムをサポートしています。事前定義されたライフタイムが要件を満たしていない場合は、ITargetSource インターフェイスを実装して適切に構成することにより、カスタム ライフタイムを作成できます。

于 2012-02-19T06:00:29.570 に答える