2009-06-21 5 views
0

Je voudrais utiliser des intercepteurs prototypes au lieu d'un intercepteur singleton afin que chaque session obtienne une nouvelle instance d'intercepteur. J'ai regardé dans la classe HibernateTransactionManager et je pense que "EntityInterceptorObjectName" et "ObjectFactory" sont les propriétés que je dois définir.Comment référencer ObjectFactory de Spring.Net dans la configuration?

Alors que EntityInterceptorObjectName est assez évident, Je n'ai aucune idée de comment référencer l'ObjectFactory quand il est la "mère de l'ObjectFactories", par exemple. la même ObjectFactory qui crée AppContext/the 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> 

Répondre

1

Si je comprends bien, vous pouvez utiliser votre propre implémentation de IObjectFactory créer les objets que vous souhaitez selon le nom donné. Si vous souhaitez utiliser les objets définis dans 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 des 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 la mise en correspondance:

<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> 
+0

Merci zoidbeck :) Je viens de découvrir que le HibernateTransactionManager implémente déjà IObjectFactoryAware donc je ne pas besoin de fixer à tous les biens ObjectFactory! Merci de m'avoir indiqué la bonne direction. – tobsen

+0

Ok, ceci est en effet la manière la plus élégante. Heureux que je pourrais aider au moins un peu et merci pour le vote :). – zoidbeck

Questions connexes