我們在我們的項目中使用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進行保存。
不幸的是,它似乎並不像你可以投到一個變量它必須是一個實際的類型,反正有這個,所以我可以將對象轉換或轉換爲其「審計」類型,而無需將構造函數/每種審覈類型的轉換器都採用其基本類型並保存屬性?