2012-02-12 1 views
2

Dependency Injection in .NET에서 저자는 Spring.NET이 사용자 정의 개체 수명 생성을 지원하지 않는다고 말합니다 (12.2 절 [수명 관리] 마지막 단락 참조).Spring.NET 지원은 사용자 정의 객체 수명을 생성합니까?

프레임 워크를 처음 접했을지라도 나는 그렇지 않을 수도 있습니다. 지금까지의 내 연구를 토대로 ITargetSource 인터페이스를 구현하여 사용자 정의 수명을 정의 할 수 있다고 생각하지만,이 인터페이스는 객체 풀링 및 핫 스왑 가능 대상 등 일부 미리 정의 된 구현과 같이 훨씬 더 많은 작업을 수행 할 수 있습니다.

내 이해가 정확합니까? 그렇다면 맞춤 수명을 만들고 구성하기위한 정확한 논리적 단계는 무엇입니까? 그렇지 않다면 Spring.NET에서 커스텀 객체 수명을 어떻게 생성합니까?

답변

3

좋아요, 실제로 다른 질문을했습니다. here이 질문에 대한 답을 얻은 것처럼 보입니다 (이것은 드문 경우 중 하나입니다). 다른 질문을하면, Spring.NET에서 커스텀 라이프 타임을 정의하는 것이 가능하다는 것을 알 수 있습니다.

요약하자면, ITargetSource 인터페이스를 구현하면 Spring.NET의 커스텀 라이프 타임을 생성 할 수 있습니다 만, 논리적으로는 미묘한 인터페이스이기 때문에 타겟 생성에 관한 멋진 작업을 수행하는 데 사용할 수 있습니다.

  • SingletonTargetSource (싱글 수명을 제공한다)
  • PrototypeTargetSource이 (과도 수명을 제공한다)
  • ThreadLocalTargetSource이 (쓰레드 범위의 수명을 제공한다)
  • : 이미 몇 구현을 포함하여 사용 가능한 (그러나 이에 국한되지 않음)이 있습니다
  • SimplePoolTargetSource는
  • HotSwappableTargetSource의
을 (런타임에 목표를 교환하는 기능을 제공합니다) (개체 풀링을 제공)

흥미롭게도 개체에 평생을 적용하는 것은 원하는 평생에 따라 매우 다를 수 있습니다. Spring.NET의 모든 객체는 기본적으로 싱글 톤입니다. (사용자 정의 포함

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

을 불행하게도 제공된 수명의 나머지 부분에 대한 이러한 편리한 속성이 없다 : 프로토 타입과 같은 객체를 (Spring.NET이 과도에 대한 이야기) 다음과 같이 당신이 싱글 = "false"로 설정을 지정하려면 구현). 따라서 스레드 로컬 범위로 객체를 구성하려고한다고 가정 해 봅시다. 위의 구성과 동일한 결과를 달성 할 경우, 다시

<?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는을 사용하여, 당신은 완전히 다른 방법으로 그것을 포함해야합니다 : 여기 ProxyFactoryObject를 사용하는 것을 할 거라고 방법 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; 
     } 
    } 
} 

마지막으로, 당신은 스레드 로컬 범위에서 대상 유형의 인스턴스를 만들 수 DefaultAdvisorAutoProxyCreator와 함께 위의 ITargetSourceCreator를 사용하려면 다음 구성을 사용합니다 : 여기

는 ThreadLocalTargetSourceCreator를 생성 베어 뼈 ITargetSourceCreator 구현입니다 : 제 생각에는

<?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> 

이 방법 당신은 싱글 (기본값)와 프로토 타입 이외의 수명은 어느 정도 비 직관적이고 확실히 diffe를 통해 간소화되지 않는 구성 (ProxyFactoryObject 대 DefaultAdvisorAutoProxyCreator)

요약하면, Spring.NET은 사용자 정의 수명을 지원합니다. 사전 정의 된 수명 중 어느 것도 요구 사항을 충족시키지 못하면 ITargetSource 인터페이스를 구현하고 적절하게 구성하여 사용자 정의 수명을 생성 할 수 있습니다.

관련 문제