EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

定制审计跟踪系统

Audit Trail模块代表的Audit Trail系统提供了一种现成的机制,用于记录对持久对象所做的更改。默认审核设置如下所述。

  • 所有持久性类(从基本持久性类继承)都由Audit Trail系统审核。
  • 持久化类拥有的所有公共简单属性和引用属性都将受到审核。但是,不审核只读属性(没有设置访问器的属性)。
  • 持久性类拥有的所有公共集合属性都将受到审核。
  • 所有对象更改-对象创建,删除和修改,已修改属性的名称,属性的初始值和实际值均经过全面审核。安全系统提供的当前用户名也会被保存。
  • 审核信息记录到应用程序数据库中。
  • 存储为斑点数据(例如图像)的属性的实际值不会保存。而是保存“ Blob数据”字符串。
  • 空值另存为“ N / A”字符串。
注意

在“详细信息视图”中修改对象后,将在加载对象后立即复制初始值。在“可编辑列表视图”中修改对象时,初始值将复制到BaseObjectSpace.ObjectChanged事件中。实际值被收集并保存在单独的工作单位BaseObjectSpace.Committed事件。

您可以在不同点自定义审核跟踪系统。本主题详细介绍了各种自定义项。

更改对象审核模式

审核跟踪系统支持多种对象审核模式。

模式 描述
满的 所有对象更改都经过全面审核。此模式是默认模式。
轻的 仅审核对象的创建,删除和修改。此模式不审核更改属性的名称和值。
仅创作 仅对象创建被审核。旨在用于数据导入。

要改变当前对象审核模式中,设置AuditTrailService.Instance.ObjectAuditingMode属性到一个ObjectAuditingMode枚举值。以下代码演示了如何实现。

XAF Windows窗体应用程序-的Program.csProgram.vb)文件:

static void Main() {
    MySolutionWindowsFormsApplication application = new MySolutionWindowsFormsApplication();
    // ...
    AuditTrailService.Instance.ObjectAuditingMode = ObjectAuditingMode.Lightweight;
    application.Setup();
    application.Start();
    //...
}

XAF ASP.NET应用程序-的Global.asax.csGlobal.asax.vb)文件:

protected void Session_Start(object sender, EventArgs e) {
    WebApplication.SetInstance(Session, new MySolutionWebApplication());
    AuditTrailService.Instance.ObjectAuditingMode = ObjectAuditingMode.Lightweight;
    //...
    WebApplication.Instance.Setup();
    WebApplication.Instance.Start();
}

审核当前用户或主机身份

如果您构建供多个最终用户同时使用的业务应用程序,则需要获取有关谁进行了特定更改的信息。为此,将应用程序安全系统的CurrentUserName属性传递到Audit Trail系统。如果不使用XAF安全系统,则可以在XAF Windows窗体应用程序中从WindowsIdentity对象获取用户名。在XAF ASP.NET Web应用程序中,可以使用HttpContext.Current.Request.UserHostAddress属性返回的值。以下代码演示了如何实现。

注意

如果您没有为Audit Trail系统指定当前用户,则将记录值。

XAF Windows窗体应用程序-的Program.csProgram.vb)文件:

using System.Security.Principal;
//...
static void Main() {
    MySolutionWindowsFormsApplication application = new MySolutionWindowsFormsApplication();
    // ...
    //Subscribe to QueryCurrentUserName event of the AuditTrailService's instance
    AuditTrailService.Instance.QueryCurrentUserName  = 
       new QueryCurrentUserNameEventHandler(Instance_QueryCurrentUserName);
    application.Setup();
    application.Start();
    //...
}
static void Instance_QueryCurrentUserName(object sender, QueryCurrentUserNameEventArgs e) {
    e.CurrentUserName = WindowsIdentity.GetCurrent().Name;
}

XAF ASP.NET应用程序-的Global.asax.csGlobal.asax.vb)文件:

protected void Session_Start(object sender, EventArgs e) {
    WebApplication.SetInstance(Session, new MySolutionWebApplication());
    AuditTrailService.Instance.QueryCurrentUserName  = 
        new QueryCurrentUserNameEventHandler(Instance_QueryCurrentUserName);
    //...
    WebApplication.Instance.Setup();
    WebApplication.Instance.Start();
}
private void Instance_QueryCurrentUserName(object sender, QueryCurrentUserNameEventArgs e) {
    e.CurrentUserName = 
        String.Format("Web user ({0})", HttpContext.Current.Request.UserHostAddress);
}

指定要审核的对象和属性

您可以修改默认审核设置,并指定要审核或从审核过程中排除的对象和属性。为此,请订阅AuditTrailService.Instance对象的CustomizeAuditTrailSettings事件。以下代码演示了如何实现。

XAF Windows窗体应用程序-的Program.csProgram.vb)文件:

using DevExpress.Persistent.AuditTrail;
//...
static void Main() {
    MySolutionWindowsFormsApplication application = new MySolutionWindowsFormsApplication();
    // ...
    AuditTrailService.Instance.CustomizeAuditTrailSettings  = 
        new CustomizeAuditSettingsEventHandler(Instance_CustomizeAuditTrailSettings);
    application.Setup();
    application.Start();
    //...
}
static void Instance_CustomizeAuditTrailSettings(object sender, 
    CustomizeAuditTrailSettingsEventArgs e) {
    e.AuditTrailSettings.Clear();
    e.AuditTrailSettings.AddType(typeof(MyObjectType), "FirstPropertyToBeAudited", "SecondPropertyToBeAudited");
}

XAF ASP.NET应用程序-的Global.asax.csGlobal.asax.vb)文件:

using DevExpress.Persistent.AuditTrail;
//...
protected void Session_Start(object sender, EventArgs e) {
    WebApplication.SetInstance(Session, new MySolutionWebApplication());
    AuditTrailService.Instance.CustomizeAuditTrailSettings  = 
        new CustomizeAuditSettingsEventHandler(Instance_CustomizeAuditTrailSettings);
    //...
    WebApplication.Instance.Setup();
    WebApplication.Instance.Start();
}
void Instance_CustomizeAuditTrailSettings(object sender, 
    CustomizeAuditTrailSettingsEventArgs e) {
    e.AuditTrailSettings.Clear();
    e.AuditTrailSettings.AddType(typeof(MyObjectType), "FirstPropertyToBeAudited", "SecondPropertyToBeAudited");
}

记下CustomizeAuditTrailSettings事件处理程序。默认设置通过AuditTrailSettings.Clear方法删除。通过AuditTrailSettings.AddType方法添加要审核的属性。您可以使用此方法的另一重载,该方法不需要指定成员名称。

e.AuditTrailSettings.AddType(typeof(MyObjectType));

该班级拥有的所有成员(均为公开成员且不是只读成员)将受到审核。如果MyObjectType公开了要审核的只读属性,请手动添加它。

e.AuditTrailSettings.AddType(typeof(MyObjectType), "ReadOnlyPropertyToBeAudited");

AuditTrailSettings.RemoveProperties方法用于排除来自审计处理的特性。

e.AuditTrailSettings.RemoveProperties(typeof(MyObjectType), "PropertyToBeExcluded");

您可以使用CustomizeAuditTrailSettings事件以其他方式自定义AuditTrailSettings对象。例如,您可以指定不审核的属性。为此,请使用AuditTrailSettings.RemoveProperties方法。

自定义数据存储机制

默认情况下,审核信息记录到应用程序数据库中(请参阅“审核跟踪模块概述”)。您可以通过处理AuditTrailService.Instance.SaveAuditTrailData事件来自定义此过程,该事件在将对象提交到数据库时引发。在此事件处理程序中,您必须使用自定义机制替换AuditDataItem对象的默认保存机制。要禁用默认存储过程,应将处理程序的SaveAuditTrailDataEventArgs.Handled参数设置为true。以下代码演示了如何实现。

XAF Windows窗体应用程序-的Program.csProgram.vb)文件:

using DevExpress.Persistent.AuditTrail;
//...
static void Main() {
    MySolutionWindowsFormsApplication application = new MySolutionWindowsFormsApplication();
    // ...
    AuditTrailService.Instance.SaveAuditTrailData  = 
        new SaveAuditTrailDataEventHandler(Instance_SaveAuditTrailData);
    application.Setup();
    application.Start();
    //...
}
static void Instance_SaveAuditTrailData(object sender, SaveAuditTrailDataEventArgs e) {
    //Save the data passed as the e.AuditTrailDataItems parameter
    //Disable the default storing procedure if it is necessary
    e.Handled = true;
}

XAF ASP.NET应用程序-的Global.asax.csGlobal.asax.vb)文件。

using DevExpress.Persistent.AuditTrail;
//...
protected void Session_Start(object sender, EventArgs e) {
    WebApplication.SetInstance(Session, new MySolutionWebApplication());
    AuditTrailService.Instance.SaveAuditTrailData  = 
        new SaveAuditTrailDataEventHandler(Instance_SaveAuditTrailData);
    //...
    WebApplication.Instance.Setup();
    WebApplication.Instance.Start();
}
static void Instance_SaveAuditTrailData(object sender, SaveAuditTrailDataEventArgs e) {
    //Save the data passed as the e.AuditTrailDataItems parameter
    //Disable the default storing procedure if it is necessary
    e.Handled = true;
}

自定义存储审核信息的机制的另一种方法是从AuditDataClass继承,并覆盖Save方法。在这种情况下,您必须使用类的实例初始化AuditTrailService.Instance.AuditDataStore属性。

实施自定义持久对象以用作审核数据存储

默认情况下,AuditDataItemPersistent类用作审核数据存储。如果要存储额外的审核信息,请从此类继承,或“从头开始”实现 IAuditDataItemPersistent接口。在AuditDataItemPersistent后代的重写的OnSaving方法中,您可以基于AuditedObject,PropertyName和基类中的其他信息来初始化其他属性。若要使用自定义类而不是默认类,请在“应用程序设计器”(而不是“模块设计器”)中设置“审计跟踪”模块的AuditDataItemPersistentType属性。

指定Null值的字符串表示形式

默认情况下,空值另存为“ N / A”字符串。如果需要,可以更改其字符串表示形式。为此,请使用AuditTrailService.Instance.AuditDataStore.NullValueString属性。

指定引用类型属性的字符串表示形式

实现AuditDataStore类的后代,并重写GetDefaultStringRepresentation方法。此外,将AuditTrailService.Instance.AuditDataStore属性设置为您的类的实例。

自定义Blob属性存储机制

默认情况下,不保存Blob属性值。而是保存“ Blob数据”字符串。您可以通过实现AuditDataStore类并覆盖Save方法来自定义此行为。在这种情况下,请将AuditTrailService.Instance.AuditDataStore属性设置为您的类的实例。

将自定义数据添加到审核日志

对象更改由AuditDataItem对象表示(请参见Audit Trail Module Overview)。您可以将自定义数据(有关未审核事件的信息)直接添加到审核日志中。这意味着您可以将AuditDataItem对象添加到Audit Data Items集合中。为此,请指定以下代码。

AuditDataItem customDataItem = new AuditDataItem(myAuditedObject, null, 
    "CustomOldValue", "CustomNewValue", AuditOperationType.CustomData);
AuditTrailService.Instance.AddCustomAuditData(mySession, customDataItem);
AuditTrailService.Instance.SaveAuditData(mySession);

可以在程序的任何位置实现此代码。例如,在自定义Controller中

注意

手动添加自定义审核数据后,应始终调用AuditTrailService.Instance.SaveAuditData方法,而不必重用View的ObjectSpace的Session。否则,审核数据将不会写入数据库。

相关文章

转载保留此链接,注明出处