.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}-------");
    }
}

创建 -- 控制器


如有错误,烦请批评指正

相关推荐
夏霞1 天前
c# 使用vs code 创建.net8.0以及.net6.0 webApi项目的教程
开发语言·c#·.net
追逐时光者1 天前
C#/.NET/.NET Core优秀项目和框架2025年11月简报
后端·.net
Aevget1 天前
界面控件DevExpress WinForms中文教程:Data Grid - 如何获取汇总值?
ui·.net·界面控件·winform·devexpress
时光追逐者1 天前
C# 中 ?、??、??=、?: 、?. 、?[] 各种问号的用法和说明
开发语言·c#·.net·.net core
e***28291 天前
四大.NET ORM框架深度对比:EF Core、SqlSugar、FreeSql与Dapper的性能、功能与适用场景
.net
缺点内向2 天前
如何在C#中为文本内容添加行号?
开发语言·c#·word·.net
星尘库2 天前
.NET Framework中报错命名空间System.Text中不存在类型或命名空间名Json
java·json·.net
遇到困难睡大觉哈哈2 天前
Harmony os 网络防火墙实战:用 @ohos.net.netFirewall 给应用加一道“网闸”
网络·.net·harmonyos·鸿蒙
搬砖的工人2 天前
.NET 9.0 与 Swagger 的集成实践:一步步构建Api文档
.net
唐青枫2 天前
C#.NET Record Struct 完全解析:语法、语义与最佳实践
c#·.net