using System.Reflection;
using Castle.DynamicProxy;
using KH.WMS.Core.Attributes;
using KH.WMS.Core.Logging;
using Microsoft.Extensions.Logging;
namespace KH.WMS.Core.AOP;
///
/// 拦截器基类
///
public class LoggingInterceptor : IInterceptor
{
private readonly ILoggerService _logger;
public LoggingInterceptor(ILoggerService logger)
{
_logger = logger;
}
public void Intercept(IInvocation invocation)
{
string methodName = $"{invocation.TargetType.Name}.{invocation.Method.Name}";
MethodInfo method = invocation.Method;
try
{
// 从方法上获取特性
LogInterceptorAttribute? _attribute = invocation.MethodInvocationTarget.GetCustomAttributes(typeof(LogInterceptorAttribute), false)
.FirstOrDefault() as LogInterceptorAttribute;
// 如果方法上没有特性,尝试从类上获取
if (_attribute == null)
{
_attribute = invocation.TargetType.GetCustomAttributes(typeof(LogInterceptorAttribute), false)
.FirstOrDefault() as LogInterceptorAttribute;
}
if (_attribute == null)
return;
// 如果没有特性,使用默认值
var logLevel = _attribute?.LogLevel ?? LogLevel.Information;
_logger.LogInfo("[方法开始] -> {MethodName}",
methodName);
// 执行方法
invocation.Proceed();
if (_attribute == null)
return;
var message = $"[方法结束] <- {methodName}";
_logger.LogInfo(message);
}
catch (Exception ex)
{
// 异常处理
OnException(invocation, methodName, ex);
}
finally
{
// 清理逻辑
OnFinally(invocation, methodName);
}
}
///
/// 异常处理
///
protected void OnException(IInvocation invocation, string methodName, Exception ex)
{
}
///
/// 清理逻辑
///
protected void OnFinally(IInvocation invocation, string methodName)
{
}
}