1

我想使用原型拦截器而不是单例拦截器,这样每个会话都会得到一个新的拦截器实例。

我查看了 HibernateTransactionManager 类,我认为“EntityInterceptorObjectName”和“ObjectFactory”是我必须设置的属性。

虽然 EntityInterceptorObjectName 非常明显,但当它是“ObjectFactories 之母”时,我不知道如何引用 ObjectFactory,例如创建 AppContext/HibernateTransactionManager 的同一个 ObjectFactory。

配置的相关部分:

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

1 回答 1

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>
于 2009-06-21T19:43:09.627 回答