我们在我们的项目中使用NHibernate,并且我们挂钩了pre update/insert/delete事件来做一些审计。.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了对象审计类。
审计类是如下
public class InstrumentAudit : Instrument
{}
它已经在它没有额外的功能,它基本上是一个黑客,让我们把它映射到我们在NHibernate的审计表。
因此,这似乎像它会工作,但问题其实来自试图处理NHibernate的事件
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);
}
}
的e.Entity是给我作为一个对象时英寸
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进行保存。
不幸的是,它似乎并不像你可以投到一个变量它必须是一个实际的类型,反正有这个,所以我可以将对象转换或转换为其“审计”类型,而无需将构造函数/每种审核类型的转换器都采用其基本类型并保存属性?