2011-05-10 60 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不是,使用表達樹創建一個,並將其存儲以備後用