目录
[一、AOP 封装](#一、AOP 封装)
[二、类拦截 案例](#二、类拦截 案例)
[三、接口拦截器 案例](#三、接口拦截器 案例)
AOP拦截器 可开启 类拦截器 和 接口拦截器
类拦截器 --- 只有方法标注 virtual标识才会启动
接口拦截器 --- 所有实现接口的方法都会启动
一、AOP 封装
cs
// 在 Program.cs 配置 builder.AddAOPExt();
//自定义 AOP 扩展
public static class CustomAOPExt
{
public static void AddAOPExt(this WebApplicationBuilder builder)
{
builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) // 工厂替换,把Autofac整合进来
.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
// 依赖注入
containerBuilder.RegisterType<CustomInterceptor>();
containerBuilder.RegisterType<Student>().As<IStudent>().EnableClassInterceptors(); // 开启类拦截器
// containerBuilder.RegisterType<Student>().As<IStudent>().EnableInterfaceInterceptors(); // 开启接口拦截器
});
}
}
二、类拦截 案例
创建 Student 和 IStudent 测试类和接口
cs
using Autofac.Extras.DynamicProxy;
namespace LOG.Test;
public interface IStudent
{
void Method_A(string name);
void Method_B(string name);
void Method_C(string name);
}
[Intercept(typeof(CustomInterceptor))]
public class Student : IStudent
{
public void Method_A(string name)
{
Console.WriteLine("Method_A" + name);
}
public virtual void Method_B(string name)
{
Console.WriteLine("Method_B" + name);
}
public void Method_C(string name)
{
Console.WriteLine("Method_C" + name);
}
}
创建 -- CustomInterceptor (自定义拦截器)
cs
using Castle.DynamicProxy;
namespace LOG.Test;
/// <summary>
/// 自定义 方法拦截器
/// </summary>
public class CustomInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine($"----Before--{invocation.Method.Name}-------");
invocation.Proceed();
Console.WriteLine($"----After---{invocation.Method.Name}-------");
}
}
创建 -- 控制器 -- 测试
三、接口拦截器 案例
开启 接口拦截器
cs
// 在 Program.cs 配置 builder.AddAOPExt();
//自定义 AOP 扩展
public static class CustomAOPExt
{
public static void AddAOPExt(this WebApplicationBuilder builder)
{
builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) // 工厂替换,把Autofac整合进来
.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
// 依赖注入
containerBuilder.RegisterType<CustomInterceptor>();
// containerBuilder.RegisterType<Student>().As<IStudent>().EnableClassInterceptors(); // 开启类拦截器
containerBuilder.RegisterType<Student>().As<IStudent>().EnableInterfaceInterceptors(); // 开启接口拦截器
});
}
}
标识接口
cs
using Autofac.Extras.DynamicProxy;
namespace LOG.Test;
[Intercept(typeof(CustomInterceptor))]
public interface IStudent
{
void Method_A(string name);
void Method_B(string name);
void Method_C(string name);
}
public class Student : IStudent
{
public void Method_A(string name)
{
Console.WriteLine("Method_A" + name);
}
public virtual void Method_B(string name)
{
Console.WriteLine("Method_B" + name);
}
public void Method_C(string name)
{
Console.WriteLine("Method_C" + name);
}
}
创建 -- CustomInterceptor (自定义拦截器)
cs
using Castle.DynamicProxy;
namespace LOG.Test;
/// <summary>
/// 自定义 方法拦截器
/// </summary>
public class CustomInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine($"----Before--{invocation.Method.Name}-------");
invocation.Proceed();
Console.WriteLine($"----After---{invocation.Method.Name}-------");
}
}
创建 -- 控制器
如有错误,烦请批评指正