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;
}
}