Dispenser/DispenserCommon/Aop/Operation.cs

63 lines
1.6 KiB
C#

using AspectInjector.Broker;
using DispenserCommon.DTO;
using DispenserCommon.Enums;
using DispenserCommon.Events;
using DispenserCommon.Utils;
using DispenserUI.Exceptions;
using Serilog;
namespace DispenserCommon.Aop;
[Aspect(Scope.Global)]
[Injection(typeof(Operation))]
public class Operation(string name) : Attribute
{
public string Name { get; set; } = name;
public Operation() : this("")
{
Name = "";
}
/// <summary>
/// 通过AOP实现方法执行过程拦截
/// </summary>
/// <param name="args"></param>
/// <param name="target"></param>
/// <param name="triggers"></param>
/// <returns></returns>
[Advice(Kind.Around, Targets = Target.Method)]
public object? Around(
[Argument(Source.Arguments)] object[] args,
[Argument(Source.Target)] Func<object[], object> target,
[Argument(Source.Triggers)] Attribute[] triggers)
{
var trigger = (Operation)triggers[0];
var log = new ActionLog
{
Name = trigger.Name,
Params = args
};
try
{
Log.Information($"正在执行: {trigger.Name}");
return target(args);
}
catch (Exception e)
{
if (e is BizException { Level: ExceptionLevel.NORMAL })
{
ToastUtil.Error($"{trigger.Name}操作失败: {e.Message}");
}
log.Exception = e;
Log.Error($"{trigger.Name}操作失败: {e.Message}");
return default;
}
finally
{
EventBus<ActionLog>.Publish(EventType.OperationLog, log);
}
}
}