AspectCore 示例

使用Vs2022创建一个Console项目

添加package AspectCore.Extensions.DependencyInjection

添加一个 LogInterceptorAttribute 类

using AspectCore.DynamicProxy;
namespace Malema.Net; // Net6 C#10 namespace可以不用加大括号了
public class LogInterceptorAttribute : AbstractInterceptorAttribute
{
    public override async Task Invoke(AspectContext context, AspectDelegate next)
    {
        Console.WriteLine("Log before invoke");
        await next(context);//调用的是原生的方法
        Console.WriteLine("Log after invoke");
    }
}

添加一个 测试类和测试接口

测试接口

namespace Malema.Net;
public interface ITestService
{
    void Test();
}

测试类

namespace Malema.Net;
public class TestService : ITestService
{
    [LogInterceptor] //注意 在这边我们添加了一个attribute
    public void Test()
    {
        Console.WriteLine("Test method");
    }
}

添加一个 依赖注入的配置类

using AspectCore.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
namespace Malema.Net;
public class DIConfig
{
    public static IServiceProvider GetServiceProvider()
    {
        var services = new ServiceCollection();

        services.AddScoped<ITestService, TestService>();

        //return services.BuildServiceProvider();
        return services.BuildDynamicProxyProvider();
    }
}

更改 Program.cs


using Malema.Net;
using Microsoft.Extensions.DependencyInjection;

//.net 6和 c#10 不需要写 main方法了
var sp = DIConfig.GetServiceProvider();
var service = sp.GetService<ITestService>();
service.Test();
Console.ReadKey();

完成之后 按 Ctrl+F5. 程序就可以跑起来了

输出

Log before invoke
Test method
Log after invoke

注意如果DI里面注入的是类的话

  services.AddScoped<TestService, TestService>();

方法要加上virtual 这样才可以拦截到

 [LogInterceptor] 
public virtual void Test()
{
    Console.WriteLine("Test method");
    SubTest();
}

[LogInterceptor] 
protected virtual void SubTest()
{

        Console.WriteLine("SubTest method");
}

类注入的话,Test调用的子方法SubTest()也是可以拦载到的,接口是不行的。

完整的代码在https://gitee.com/malema/Examples/tree/AspectCore/Example1/AspectCore-Example这边可以看到 可以用下面的git命令把代码签出到本地

git clone https://gitee.com/malema/Examples
git checkout AspectCore/Example1
最近更新的
...