2009-06-21 4 views
0

Ich möchte Prototyp-Interzeptoren anstelle eines Singleton Interceptor verwenden, so dass jede Sitzung eine neue Interceptor-Instanz erhalten würde.Wie Referenz Spring.Net's ObjectFactory in der Config?

Ich schaute in die HibernateTransactionManager-Klasse und ich denke, "EntityInterceptorObjectName" und "ObjectFactory" sind die Eigenschaften, die ich festlegen muss.

Während EntityInterceptorObjectName ist ziemlich offensichtlich, Ich habe keine Ahnung, wie die ObjectFactory, wenn es die "Mutter der ObjectFactories", z. Dieselbe ObjectFactory, die den AppContext/den HibernateTransactionManager erstellt.

Der relevante Teil der config:

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

Antwort

1

Wie ich es verstehe Sie eine eigene Implementierung von IObjectFactory Erstellen der Objekte verwenden, können Sie den Vornamen nach wollen. Wenn Sie die in Ihrem Spring-ApplicationContext definierten Objekte verwenden möchten, können Sie IObjectFactoryAware auch implementieren, um Ihre ObjectFactory mit Ihrem Spring IoC Container zu verbinden.

Dies sollte Ihnen ermöglichen, zu tun, was Sie wollen. Erstellen Sie neue Instanzen einer beliebigen Klasse und füllen Sie deren Eigenschaften mit Objekten aus Ihrem IoC-Container (z. B. 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); 
    } 
} 

und die Abbildung:

<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

Dank zoidbeck :) ich gerade herausgefunden, dass die HibernateTransactionManager bereits implementiert IObjectFactoryAware so muss ich gar nicht die Object Eigenschaft! Danke, dass Sie mich in die richtige Richtung weisen. – tobsen

+0

Ok, das ist in der Tat der elegantere Weg. Froh, dass ich wenigstens ein wenig helfen konnte und danke für die Abstimmung :). – zoidbeck

Verwandte Themen