.Net6 Web Core API --- Autofac -- AOP

目录

[一、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}-------");
    }
}

创建 -- 控制器


如有错误,烦请批评指正

相关推荐
武藤一雄10 小时前
C# 关于多线程如何实现需要注意的问题(持续更新)
windows·后端·microsoft·c#·.net·.netcore·死锁
我是唐青枫16 小时前
深入理解 System.Lazy<T>:C#.NET 延迟初始化与线程安全
c#·.net
波波00718 小时前
.sln 时代落幕,.slnx成为 .NET 新标准?
.net·vs
mudtools18 小时前
基于.NET操作Excel COM组件生成数据透视报表
c#·.net·excel
冰茶_20 小时前
WPF路由事件:隧道与冒泡机制解析
学习·c#·.net·wpf·.netcore·mvvm
我是唐青枫21 小时前
深入理解 Volatile:C#.NET 内存可见性与有序性
c#·.net
武藤一雄1 天前
C# 关于GC垃圾回收需要注意的问题(持续更新)
后端·微软·c#·.net·.netcore
武藤一雄1 天前
C# 关于应用程序域(AppDomain)需要注意的问题(持续更新)
后端·microsoft·微软·c#·.net·.netcore
HarryXYC1 天前
【vb.net】实现简单的内网文件分享网站
.net·web·文件共享·vb.net
bugcome_com1 天前
.NET 核心:Func 与 Action 委托(从入门到实战)
c#·.net