구성에서 spring.net의 ObjectFactory를 참조하는 방법은 무엇입니까?
-
06-07-2019 - |
문제
싱글 톤 인터셉터 대신 프로토 타입 인터셉터를 사용하여 각 세션에서 새로운 인터셉터 인스턴스를 얻을 수 있습니다.
HibernateTransactionManager 클래스를 살펴 보았고 "EntityInterceptorObjectName"과 "ObjectFactory"가 설정 해야하는 속성이라고 생각합니다.
EntityInterceptorObjectName은 꽤 분명하지만 객체를 참조하는 방법에 대한 단서가 없습니다 "ObjectFactories의 어머니"인 경우, 예를 들어 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>
해결책
이해할 수 있듯이 주어진 이름에 따라 원하는 객체를 만드는 IObjectFactory의 구현을 사용할 수 있습니다. Spring-ApplicationContext 내에서 정의 된 객체를 사용하려면 IOBJEctFactoryAware를 구현하여 ObjectFactory를 스프링 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>
제휴하지 않습니다 StackOverflow