2009-10-19 3 views
3

Castle.DynamicProxy2를 사용하여 NHibernate 지속 클래스 내에서 코드를 정리하려고합니다. 다음은 간단한 버전입니다.NHibernate 객체에 동적 프록시 사용하기

애완 동물 클래스 :

public class Pet 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

그리고 그것의 매핑 파일 :

<class name="Pet" table="Pet"> 
    <id name="Id" column="Id" unsaved-value="0"> 
    <generator class="native"/> 
    </id> 
    <property name="Name" column="Name"/> 
    <property name="Age" column="Age"/> 
</class> 

애완 동물 클래스의 인스턴스를 감사 할 필요가있다. 일반적으로 Name 및 Age 속성은 자동 속성이 아니며 값 변경 내용을 기록하는 논리를 포함합니다. 이제 프록시를 사용하여 속성 설정자 내에서 감사 논리를 삽입 할 생각입니다. 그것은 Castle.DynamicProxy2를 사용하여 애완 동물 클래스의 감사 인스턴스를 만들 수있을만큼 간단

public class Auditor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     // Do something to record changes 
     invocation.Proceed(); 
    } 
} 

:이를 위해, 나는 감사 IInterceptor를 만들었습니다.

Pet aPet = proxyGenerator.CreateClassProxy<Pet>(new Auditor()); 
aPet.Name = "Muffles"; // The Auditor instance would record this. 
aPet.Age = 4;   // and this too... 

여기에 문제가 있습니다. Pet가 유지 되었기 때문에, 시스템은 NHibernate를 통해 가져온 Pet의 인스턴스에 대해 작업해야합니다. 내가 일이 원하는 것은 NHibernate에은과 같이 자동으로 애완 동물 프록시의 인스턴스를 반환하는 것입니다 :이 같은 뭔가 주위 얻을 수 있지만

// I would imagine an instance of Auditor being created implicitly 
ICriteria criteria = session.CreateCriteria(typeof(Pet)); 
criteria.Add(Expression.Expression.Eq("Name", "Muffles")); 

// return a list of Pet proxies instead 
// so changes can be recorded. 
IList<Pet> result = criteria.List<Pet>(); 

Pet aPet = result[0]; 
aPet.Age = aPet.Age + 1; 

// I expect this to succeed since the proxy is still a Pet instance 
session.Save(aPet); 

내가 한 :

ICriteria criteria = session.CreateCriteria(ProxyHelper.GetProxyType<Pet>()); 
criteria.Add(Expression.Expression.Eq("Name", "Muffles")); 

// use List() instead of List<T>() 
// and IList instead of IList<Pet> 
IList results = criteria.List(); 

ProxyHelper.GetProxyType<Pet>()이를 반환 곳 캐시 된 애완 동물 프록시 유형. 주요 단점은이 솔루션이 일반 목록 (예 : IList<Pet>)에서 작동하지 않는다는 것입니다. 정리하려고하는 기존 시스템은 광범위하게 사용합니다.

누군가가 해결 방법이 있거나 내가하고있는 일이 적절한 지에 대한 통찰력이 있다면 바라고 있습니다.

감사합니다 만,

카를로스

답변

0

this post에서보세요. Author는 NHibernate에서 ProxyFactoryFactory (nice name =)의 개념을 사용하여 엔티티 클래스에 대한 커스텀 프록시를 구현한다.

ProxyFactoryFactory 유형 through configuration 또는 코드를 설정할 수 있습니다.

아마도이 작업을 해결할 것입니다.

+0

포스트를 체크 아웃하고 ProxyFactoryFactory를 찾은 후에 http://ayende.com/Blog/archive/2007/04/17/Advance-Extending-NHibernate-Proxies.aspx를 발견했습니다. 내 자신의 프록시 팩토리를 사용하도록 NHibernate를 확장하는 것은 훌륭하지만,로드 된 (lazy) 클래스에서만 작동 할 것이다. 나는 여전히 게으른로드되지 않은 클래스를 프록시 할 필요가있다. – ca7l0s

3

NHibernate Event Listeners을 사용할 수 있습니다.

NHibernate의 이벤트 시스템에 연결하여 이러한 작업을 가로 챕니다. 명백한 런타임 생성 프록시 생성 성능 향상으로 인해 프록시 사용보다 더 좋은 아이디어 일 수 있습니다.

실제로 링크는 감사 응용 프로그램 예제를 보여줍니다.

+0

+1 감사가 엔티티 클래스에 대한 추가 책임으로 보입니다. –

관련 문제