AutoFac AOP

AOP
1,创建一个拦截器
/// <summary>
/// 拦截器
/// </summary>
public class CallLogger : IInterceptor
{
    /// <summary>
    /// 拦截方法,打印被拦截的方法执行前的名称,参数和执行方法后的 返回结果
    /// </summary>
    /// <param name="invocation"></param>
    /// <exception cref="NotImplementedException"></exception>
    public void Intercept(IInvocation invocation)
    {
        Debug.WriteLine($"调用方法:{invocation.Method.Name}");
        Debug.WriteLine($"参数:{string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()))}");

        //执行方法
        invocation.Proceed();

        Debug.WriteLine($"方法执行完毕,返回结果:{invocation.ReturnValue}");

    }
}
2,添加一个服务,调用此服务的方法,会被拦截
public class NewCircleService
{
    public virtual int Area() //必须是虚方法
    {
        Debug.WriteLine("计算圆形的面积");
        return 100;
    }
}
3,将拦截器注册到AutoFac
/// <summary>
/// 提供给Autofac访问
/// </summary>
/// <param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder)
{
    ......
    //将拦截器注册到Autofac
    builder.Register(a => new CallLogger()); 
}
4,指明拦截的类型(方式有两种:方式1和方式2),并启用拦截器
/// <summary>
/// 提供给Autofac访问
/// </summary>
/// <param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder)
{
    ......
    .InterceptedBy(typeof(CallLogger))  //方式2,注册类型到容器的时候动态注入拦截器
    .EnableClassInterceptors(); //启用类拦截器
}
方式1:给服务声明特性
[Intercept(typeof(CallLogger))] //特性方式指明拦截器(方式1)
public class NewCircleService
{
    ......
}

如果是拦截接口:
4,启用拦截器
/// <summary>
/// 提供给Autofac访问
/// </summary>
/// <param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder)
{
    ......
    .InterceptedBy(typeof(CallLogger))  //方式2,注册类型到容器的时候动态注入拦截器
    .EnableInterfaceInterceptors(); //启用接口启用拦截器
}
2,添加一个服务,调用此服务的方法,会被拦截
public interface ICircleService
{
    int Area();
}
public class CircleService : ICircleService
{
    public int Area()
    {
        Debug.WriteLine("计算圆形的面积");
        return 500;
    }
}

 

posted @ 2022-12-29 12:28  三五八团楚云飞  阅读(79)  评论(0)    收藏  举报