Pregunta

Me gustaría utilizar prototipos de interceptores en lugar de un interceptor singleton para que cada sesión obtenga una nueva instancia de interceptor.

Miré en la clase HibernateTransactionManager y creo que "EntityInterceptorObjectName " y "ObjectFactory" son las propiedades que tengo que configurar.

Si bien EntityInterceptorObjectName es bastante obvio, no tengo idea de cómo hacer referencia a ObjectFactory cuando es la "madre de ObjectFactories", p. el mismo ObjectFactory que crea el AppContext / HibernateTransactionManager.

La parte relevante de la configuración:

   <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>  
¿Fue útil?

Solución

Según tengo entendido, puede usar su propia Implementación de IObjectFactory creando los objetos que desee de acuerdo con el nombre dado. Si desea poder utilizar los objetos definidos en su Spring-ApplicationContext, también puede implementar IObjectFactoryAware para conectar su ObjectFactory a su Spring IoC Container.

Esto debería permitirle hacer lo que quiera. Cree nuevas instancias de cualquier clase y complete sus propiedades con objetos de su contenedor IoC (por ejemplo, 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);
   }   
}

y el mapeo:

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top