Domanda

Vorrei usare intercettori prototipo anziché un intercettore singleton in modo che ogni sessione ottenga una nuova istanza di intercettore.

Ho esaminato la classe HibernateTransactionManager e penso " EntityInterceptorObjectName " e " ObjectFactory " sono le proprietà che devo impostare.

Mentre EntityInterceptorObjectName è abbastanza ovvio, non ho idea di come fare riferimento a ObjectFactory quando è la "madre delle ObjectFactories", ad es. lo stesso ObjectFactory che crea AppContext / HibernateTransactionManager.

La parte rilevante della configurazione:

   <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>  
È stato utile?

Soluzione

A quanto ho capito puoi usare la tua Implementazione di IObjectFactory creando gli oggetti che desideri in base al nome indicato. Se vuoi essere in grado di usare gli oggetti definiti in Spring-ApplicationContext, puoi anche implementare IObjectFactoryAware per connettere ObjectFactory al tuo contenitore IoC Spring.

Questo dovrebbe permetterti di fare quello che vuoi. Crea nuove istanze di qualsiasi classe e riempi le sue proprietà con oggetti dal tuo contenitore IoC (ad esempio 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);
   }   
}

e la mappatura:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top