using Castle.DynamicProxy; using System.Linq; namespace Abp.EntityHistory { internal class EntityHistoryInterceptor : IInterceptor { public IEntityChangeSetReasonProvider ReasonProvider { get; set; } public EntityHistoryInterceptor() { ReasonProvider = NullEntityChangeSetReasonProvider.Instance; } public void Intercept(IInvocation invocation) { var methodInfo = invocation.MethodInvocationTarget; var useCaseAttribute = methodInfo.GetCustomAttributes(true).OfType().FirstOrDefault() ?? methodInfo.DeclaringType.GetCustomAttributes(true).OfType().FirstOrDefault(); if (useCaseAttribute?.Description == null) { invocation.Proceed(); return; } using (ReasonProvider.Use(useCaseAttribute.Description)) { invocation.Proceed(); } } } }