2012-02-12 89 views
2

在書Dependency Injection in .NET中,作者說Spring.NET不支持創建自定義對象的生命週期(請參閱第12.2節[管理生命週期]的最後一段)。Spring.NET是否支持創建自定義對象生存期?

儘管我對框架還不熟悉,但我認爲這可能並非如此。根據我迄今爲止的研究,我認爲可以通過實現ITargetSource接口來定義自定義生命週期,但可以說,這個接口可以做的遠不止這些(如一些預定義的實現包括對象池和熱交換目標等)。

我的理解是否正確?如果是,創建AND配置自定義生命週期的確切邏輯步驟是什麼?如果不是,如何在Spring.NET中創建自定義對象生命週期?

回答

3

好吧,所以我其實問了另一個問題here,似乎在這個過程中回答了這個問題(這是您自己回答兩個自己的問題並回答自己發佈的答案的罕見場合之一)。如果你遵循另一個問題,你會發現在Spring.NET中定義自定義的生活時間確實是可能的。

總而言之,Spring.NET中的自定義生命週期可以通過實現ITargetSource接口來創建,儘管可以說它是一個微妙的接口,可以用來做創建目標的奇妙事情。有可用,包括(但不限於)已經很少實現:

  • SingletonTargetSource(提供單壽命)
  • PrototypeTargetSource(提供了短暫的壽命)
  • ThreadLocalTargetSource的(提供了線程範圍的壽命)
  • SimplePoolTargetSource(提供對象池)
  • HotSwappableTargetSource(提供在運行時交換目標的能力)

有趣的是,根據你想要的生命週期,對你的對象應用一個生命週期可能會有很大的不同。 Spring.NET中的所有對象默認都是單例。要指定一個對象作爲原型(Spring.NET說話瞬態),設置單=「假」,如下所示:

<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接口並進行適當配置來創建自定義生命週期。