2009-06-21 2 views
0

Я хотел бы использовать прототипы-перехватчики вместо одноэлементного перехватчика, чтобы каждый сеанс получал новый экземпляр перехватчика.Как ссылаться на ObjectFactory Spring.Net в config?

Я изучил класс HibernateTransactionManager, и я думаю, что «EntityInterceptorObjectName» и «ObjectFactory» - это свойства, которые я должен установить.

В то время как EntityInterceptorObjectName довольно очевиден, У меня нет подсказки, как ссылаться на ObjectFactory, когда это «мать ObjectFactories», например. тот же ObjectFactory, который создает AppContext/HibernateTransactionManager.

Соответствующая часть конфигурации:

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

ответ

1

Как я понимаю вы можете использовать свою собственную реализацию IObjectFactory создания объектов, которые вы хотите в соответствии с данным именем. Если вы хотите использовать объекты, определенные в Spring-ApplicationContext, вы также можете реализовать IObjectFactoryAware для подключения вашего объекта ObjectFactory к контейнеру Spring IoC.

Это должно позволить вам делать все, что вы хотите. Создайте новые экземпляры любого класса и заполните его свойства объектами из вашего контейнера IoC (например, 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); 
    } 
} 

и отображение:

<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

Благодаря zoidbeck :) Я только что узнал, что HibernateTransactionManager уже реализует IObjectFactoryAware поэтому мне не нужно, чтобы установить ObjectFactory собственность на всех! Спасибо, что указал мне в правильном направлении. – tobsen

+0

Хорошо, это действительно более элегантный способ. Рад, что я мог бы помочь хотя бы немного и THX для голосования :). – zoidbeck

Смежные вопросы