前言:我们已经使用工厂模式得到需要的service对象,以下方法可以通过Castle.DynamicProxy给service对象的方法添加拦截器。
/// <summary> /// 创建服务根据BLL接口 /// </summary> public static T CreateService<T>() where T : class { var service = serviceFactory.CreateService<T>(); //拦截,可以写日志.... var generator = new ProxyGenerator(); var dynamicProxy = generator.CreateInterfaceProxyWithTargetInterface<T>( service, new InvokeInterceptor()); return dynamicProxy; } internal class InvokeInterceptor : IInterceptor { public InvokeInterceptor(){} /// <summary> /// 拦截方法 /// </summary> /// <param name="invocation"></param> public void Intercept(IInvocation invocation) { try { invocation.Proceed(); } catch (Exception exception) { if (exception is BusinessException) throw; var message = new { exception = exception.Message, exceptionContext = new { method = invocation.Method.ToString(), arguments = invocation.Arguments, returnValue = invocation.ReturnValue } }; Log4NetHelper.Error(LoggerType.ServiceExceptionLog, message, exception); throw; } } }
倘若我们调用service对象的某个执行方法,则先会执行InvokeInteceptor的Intercept方法~当执行到该方法的invocation.Proceed();才会去执行实际我们需要执行的代码。这就是所谓的拦截。
时间: 2024-10-13 14:31:29