Как ссылаться на ObjectFactory Spring.Net в конфигурации?
-
06-07-2019 - |
Вопрос
Я хотел бы использовать прототип перехватчики вместо одноэлементного перехватчика, чтобы каждый сеанс получал новый экземпляр перехватчика.
Я заглянул в класс 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>
Решение
Насколько я понимаю, вы можете использовать собственную реализацию 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>