Question

J'aimerais utiliser des prototypes d'intercepteurs au lieu d'un intercepteur singleton pour que chaque session obtienne une nouvelle instance d'intercepteur.

J'ai consulté la classe HibernateTransactionManager et je me suis dit "EntityInterceptorObjectName". et " ObjectFactory " sont les propriétés que je dois définir.

Bien que EntityInterceptorObjectName soit assez évident, je ne sais pas comment faire référence à ObjectFactory lorsqu'il s'agit de la "mère de ObjectFactories", par ex. même ObjectFactory qui crée AppContext / HibernateTransactionManager.

La partie pertinente de la configuration:

   <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>  
Était-ce utile?

La solution

Si j'ai bien compris, vous pouvez utiliser votre propre implémentation d'IObjectFactory pour créer les objets souhaités en fonction du nom donné. Si vous souhaitez pouvoir utiliser les objets définis dans votre Spring-ApplicationContext, vous pouvez également implémenter IObjectFactoryAware pour connecter votre ObjectFactory à votre conteneur Spring IoC.

Cela devrait vous permettre de faire ce que vous voulez. Créez de nouvelles instances de n'importe quelle classe et remplissez ses propriétés avec les objets de votre conteneur IoC (par exemple, 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);
   }   
}

et le mappage:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top