2012-02-12 121 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接口并进行适当配置来创建自定义生命周期。

相关问题