문제

싱글 톤 인터셉터 대신 프로토 타입 인터셉터를 사용하여 각 세션에서 새로운 인터셉터 인스턴스를 얻을 수 있습니다.

HibernateTransactionManager 클래스를 살펴 보았고 "EntityInterceptorObjectName"과 "ObjectFactory"가 설정 해야하는 속성이라고 생각합니다.

EntityInterceptorObjectName은 꽤 분명하지만 객체를 참조하는 방법에 대한 단서가 없습니다 "ObjectFactories의 어머니"인 경우, 예를 들어 AppContext/HibernateTransactionManager를 생성하는 동일한 ObjectFactory입니다.

구성의 관련 부분 :

   <object id="HibernateTransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate20">
    <property name="DbProvider" ref="DbProvider"/>
    <property name="SessionFactory" ref="SessionFactory"/>
    <!-- the name of my non-Singleton EntityInterceptor-->
     <property name="EntityInterceptorObjectName" value="MyPrototypeEntityInterceptor" />
    <!-- What should I put as ref here? -->
    <property name="ObjectFactory" ref="" />
  </object>

  <object id="MyPrototypeEntityInterceptor" type="Hib.EntityInterceptor, Hib.Interceptors" singleton="false">
  </object>  
도움이 되었습니까?

해결책

이해할 수 있듯이 주어진 이름에 따라 원하는 객체를 만드는 IObjectFactory의 구현을 사용할 수 있습니다. Spring-ApplicationContext 내에서 정의 된 객체를 사용하려면 IOBJEctFactoryAware를 구현하여 ObjectFactory를 스프링 IOC 컨테이너에 연결할 수도 있습니다.

이것은 당신이 원하는대로 할 수있게 해줄 것입니다. 모든 클래스의 새로운 인스턴스를 만들고 IOC 컨테이너의 객체로 속성을 채우십시오 (예 : SessionFactory, ...).

public class MyObjectFactoryAware : IObjectFactoryAware, IObjectFactory
{
   //this property will be set by the IoC container
   ObjectFactory {get; set;}

   //IObjectFactory implementation
   virtual object GetObject(string objectName)
   {
      MyEntityInterceptor interceptor = new MyEntityInterceptor();
      interceptor.SessionFactory = this.ObjectFactory.getObject("SessionFactory");
      return interceptor;

      //or of course if you just need it for wireing simply:
      //return this.ObjectFactory.getObject(objectName);
   }   
}

그리고 매핑 :

<object id="HibernateTransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate20">
  <property name="DbProvider" ref="DbProvider"/>
  <property name="SessionFactory" ref="SessionFactory"/>
  <!-- the name of my non-Singleton EntityInterceptor-->
  <property name="EntityInterceptorObjectName" value="MyPrototypeEntityInterceptor" />
  <!-- and the name of the objectFactory -->
  <property name="ObjectFactory" ref="MyObjectFactory" />
</object>

<object id="MyObjectFactory" type="Hib.MyObjectFactoryAware, Hib.Interceptors">
</object>

<object id="MyPrototypeEntityInterceptor" type="Hib.EntityInterceptor, Hib.Interceptors" singleton="false">
</object>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top