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