2011-05-10 8 views
0

프로젝트에서 NHibernate를 사용하고 있으며 일부 업데이트를 수행하기 위해 사전 업데이트/삽입/삭제 이벤트에 연결하고 있습니다..NET 유형을 하위 유형으로 변환

소스 테이블과 동일한 스키마 ("업데이트", "삽입"등의 감사 작업이있을 수 있음)가있는 자체 감사 테이블로 각 엔티티를 감사하려고합니다.

자동으로 트리거를 생성하는 unHAddins를 보았지만 받아 들일 수없는 주 테이블을 변경할 때 감사 테이블을 삭제하고 다시 만들 것 같습니다. 우리는 또한 사용자 정의 논리를 가질 필요가 있습니다. 실제 속성의 특정 상황에서만 레코드를 감사합니다 (우리가 관심을 갖는 속성은 모든 개체의 기본 클래스의 일부입니다).

간단히 말해서 기존 도메인 클래스를 확장 한 다음 확장 클래스에 대한 새로운 Nhibernate 매핑을 정의 할 수 있다고 생각했습니다. 예를 들어

:

우리는 클래스 악기

public class Instrument : BaseObject, IAuditable 
    { 
     public virtual string Title { get; set; } 

     public virtual IList<Control> Controls { get; set; } 

     public virtual CouncilRegion Region { get; set; } 

     public Type GetAuditType() 
     { 
      return typeof (InstrumentAudit); 
     } 

우리가 어떤 Iauditable 개체에 대한 감사 클래스 어떤 클래스를 찾을 수 있도록 내가 인터페이스 Iauditable을 정의한있다. 기본적으로 우리가 NHibernate에 우리의 감사 테이블에 매핑 할 수있는 해킹 거기에 추가 기능입니다 없다

public class InstrumentAudit : Instrument 
{} 

을 다음과 같이

감사 클래스입니다. 그것이 작동하는 것처럼

그래서이 보이지만 문제는 실제로 NHibernate에 이벤트 e.Entity는 Object로서 나에게 주어진

public class EventListener: IPreInsertEventListener, IPreUpdateEventListener, IPreDeleteEventListener 
{ 
    private readonly IAuditLogger _logger = new AuditLogger(); 

    public bool OnPreInsert(PreInsertEvent e) 
    { 
     Audit(e.Entity as BaseObject, AuditType.Insert); 
     return false; 
    } 
} 
private void Audit(object entity, AuditType auditType) 
     { 
      if(entity is IAuditable && entity is BaseObject) 
      { 
       _logger.Log(entity, auditType); 
      } 
     } 

을 처리 할 때 제공됩니다.

public class AuditLogger : IAuditLogger 
    { 
     public void Log(object entity, AuditType auditType) 
     { 
      if (entity is IAuditable && entity is BaseObject) 
      { 
       var auditObject = entity as IAuditable; 

       Type type = auditObject.GetAuditType(); 

       var x = (type) auditObject; 

       DataRepository.Instance.Save(x); 
      } 
     } 
    } 

위는 기본적으로 나는 개체가 감사해야 하나라는 것을 알고, 내가 일을하고자하는 코드이며 내 기본 개체 중 하나입니다, 그래서의 하위 유형으로 변환하고 싶습니다 감사 객체를 저장하고 nhibernate로 전달하여 저장합니다.

불행히도 실제 유형이어야하는 변수에 캐스트 할 수있는 것처럼 보이지 않습니다. 어쨌든이 모든 것이 캐스트가되거나 생성자를 넣지 않아도 객체를 "감사"유형으로 변환 할 수 있습니다. 기본 유형을 취하여 속성을 저장하는 각 감사 유형에 대한 변환기?

답변

0

아니라, 쉬운 대답은, 당신이 당신의 auditObject가 InstrumentAudit의 어떤 인스턴스 또는 서브 클래스가 없을 수없는 경우

악기와 InstrumentAudit 클래스 사이에 추가 필드 또는 방법이 없다해서

은 그렇지 않습니다 Instrument가 InstrumentAudit의 서브 클래스가 아니기 때문에 악기가 InstrumentAudit으로 쉽게 캐스팅 될 수 있다는 것을 의미합니다. x 변환기를 구현하지 않고 객체를 복제하는 방법을 원한다면 look @ expression 트리가 있어야합니다 : 인덱싱 된 함수 사전을 설정할 수 있습니다. 해당하는 감사 유형에 의해 "복제"기능을 저장합니다 ... dict에서 필요한 유형의 복제 기능을 찾으면 사용하십시오. if 그렇지 않다면 표현 트리를 사용하여 하나 만들고 나중에 사용하기 위해 저장하십시오

관련 문제