码迷,mamicode.com
首页 > 其他好文 > 详细

Castle.DynamicProxy 拦截器

时间:2015-07-30 23:10:40      阅读:375      评论:0      收藏:0      [点我收藏+]

标签:

前言:我们已经使用工厂模式得到需要的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();才会去执行实际我们需要执行的代码。这就是所谓的拦截。

Castle.DynamicProxy 拦截器

标签:

原文地址:http://www.cnblogs.com/chenjianxiang/p/4690683.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!