2011-05-10 92 views
0

我们在我们的项目中使用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进行保存。

不幸的是,它似乎并不像你可以投到一个变量它必须是一个实际的类型,反正有这个,所以我可以将对象转换或转换为其“审计”类型,而无需将构造函数/每种审核类型的转换器都采用其基本类型并保存属性?

回答

0

好,简单的答案是,你不能,如果你的auditObject没有InstrumentAudit的实例或子类

只是因为有仪器和InstrumentAudit类之间没有额外的字段或方法,它不意味着你可以很容易地从Instrument转换到InstrumentAudit,因为Instrument不是InstrumentAudit的子类

如果你想克隆你的对象而不需要实现x转换器,可以看看@ expression trees:你可以设置一个函数字典,索引通过相应的审计类型,存储“克隆”功能......如果在字典中找到所需类型的克隆函数,则使用它... if不是,使用表达树创建一个,并将其存储以备后用