1

各セッションが新しいインターセプター インスタンスを取得するように、シングルトン インターセプターの代わりにプロトタイプ インターセプターを使用したいと考えています。

HibernateTransactionManager Class を調べたところ、「EntityInterceptorObjectName」と「ObjectFactory」が設定する必要があるプロパティだと思います。

EntityInterceptorObjectName は非常に明白ですが、「ObjectFactory の母」である 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 に答える