2009-07-20 8 views
11

DDD와 NHibernate를 사용하여 도메인 객체를 유지합니다. 내 데이터베이스 엔티티와 관련된 모든 테이블에는 감사 추적에 사용되는 네 개의 추가 열 (CreatedBy, UpdatedBy, CreatedDate, UpdatedDate)이 있습니다. 집계 루트 만 저장할 수있는 저장소 패턴을 사용하고 있습니다. NHibernate가 엔티티를 집계 루트에 저장하려고 할 때 엔티티에 감사 속성이 설정되어 있지 않기 때문에 SQL DateTime 오류가 발생합니다. 저장하기 전에 객체에 속성을 설정하는 Hibernate의 방법이 있습니까?NHibernate가 저장시 자동으로 속성을 설정합니다.

여기에 약간의 예가 나와 있습니다. 나는 집계 루트 인 Order 객체를 가지고있다. Order의 하위 인 OrderNote 오브젝트도 있습니다. OrderNote를 Order에 추가 한 다음 Order를 저장하면 CreatedDate/UpdatedDate가 SQL DateTime 오버플로를 일으키는 DateTime.MinValue로 설정되어 예외가 발생합니다. 이러한 감사 열은 지속성의 일부이며 문제가있는 도메인과 관련이 없으므로 주문 집계 루트가 메모를 추가 할 때 이러한 속성을 설정하지 않기를 바랍니다. 감사 열/속성은 도메인이 아닌 지속성 프레임 워크에서만 인식해야합니다. 저장 또는 업데이트 할 때 NHibernate에 이러한 속성을 설정하도록 지시 할 수 있어야합니다. 이것을 할 수있는 방법이 있습니까? 이 작업을 수행 할 수 있습니다

답변

11

인터셉터 :

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors (9.10, 링크가 항상 작동하지 않습니다). 문서로부터

컷/붙여

public class AuditInterceptor : IInterceptor 
{ 
    ... 

    public boolean OnSave(object entity, 
          object id, 
          object[] state, 
          string[] propertyNames, 
          IType[] types) 
    { 
     if (entity is IAuditable) 
     { 
      for (int i=0; i<propertyNames.Length; i++) 
      { 
       if ("CreateTimestamp" == propertyNames[i]) 
       { 
        state[i] = DateTime.Now; 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

} 

OnFlushDirty()는 UpdatedDate 위해 사용될 수있다.

CreatedDate/UpdatedDate가있는 모든 엔티티가 인터셉터가 작동해야하는지 (예 : IAuditable인지) 확인할 수 있도록 인터페이스를 구현하려고합니다.


편집

그냥 눈치 제 11 장 : 인터셉터 및 이벤트. EmptyInterceptor에서 상속받을 수 있습니다. EmptyInterceptor는 메소드 중 일부만 재정의해야하는 경우 작업을 더 쉽게 만듭니다.

이벤트를 사용한 적이 없습니다.

+0

위대한. 그게 내가 원하는거야. 나는 NHibernate에 익숙하지 않았고이 기능을 알지 못했다. 도메인이 그들을 볼 수 없도록 보호 된 속성으로 구현 된 IAuditable 인터페이스가 있습니다. – awilinsk

1

당신도 당신을 도울 수있는 NHibernate의 버전 시스템을 볼 수 있습니다;)

관련 문제