Como fazer referência a ObjectFactory de Spring.Net na configuração?
-
06-07-2019 - |
Pergunta
Eu gostaria de usar protótipos de interceptores em vez de um interceptor singleton assim cada sessão iria receber uma nova instância interceptor.
Eu olhei para a classe HibernateTransactionManager e eu acho "EntityInterceptorObjectName" e "ObjectFactory" são as propriedades eu tenho que definir.
Enquanto EntityInterceptorObjectName é bastante óbvio, Eu não tenho idéia como fazer referência a ObjectFactory quando é a "mãe dos ObjectFactories", por exemplo, o mesmo ObjectFactory que cria o AppContext / o HibernateTransactionManager.
A parte relevante do 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>
Solução
Pelo que entendi, você pode usar sua própria implementação de IObjectFactory criar os objetos que deseja de acordo com o nome dado. Se você quer ser capaz de usar os objetos definidos dentro de sua Primavera-ApplicationContext você também pode implementar IObjectFactoryAware para conectar seu ObjectFactory ao seu Primavera IoC Container.
Isso deve permitir que você faça o que quiser. Criar novas instâncias de qualquer classe e preencher suas propriedades com objetos de seu contêiner IoC (por exemplo 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);
}
}
eo mapeamento:
<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>