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