Castle.DynamicProxy拦截器
在asp.net mvc或asp.net miniapi中,有过滤器,可以在请求前或后增加一层,达到验证,过滤等作用,如果在Service的方法前后加一层呢?这里介绍一下Castle.DynamicProxy的用法。
首先引入
Castle.Core
实现代码相对轻量:
using Castle.DynamicProxy;
using Microsoft.Extensions.DependencyInjection.Extensions;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddInterceptedSingleton<ITestService, TestService, AddLogInterceptor>();
var app = builder.Build();
app.MapGet("/test", (ITestService test) =>
{
app.Logger.LogInformation("/test开始");
var result = test.Get(121);
app.Logger.LogInformation("/test结束");
return result;
});
app.Run();
public interface ITestService
{
string Get(int id);
}
public class TestService : ITestService
{
private readonly ILogger<TestService> _logger;
public TestService(ILogger<TestService> logger)
{
_logger = logger;
}
public string Get(int id)
{
_logger.LogInformation("TestService.Get({id})", id);
return "OK";
}
}
public class AddLogInterceptor : IInterceptor
{
private readonly ILogger<AddLogInterceptor> _logger;
public AddLogInterceptor(ILogger<AddLogInterceptor> logger)
{
_logger = logger;
}
public void Intercept(IInvocation invocation)
{
//用invocation可以获取被调用对象和方法的信息
_logger.LogInformation("开始调用{name},参数:{args}", invocation.Method.Name, string.Join(",", invocation.Arguments));
invocation.Proceed();
_logger.LogInformation("结束调用{name},返回结果:{result}", invocation.Method.Name, invocation.ReturnValue);
}
}
public static class InterceptedExpansion
{
public static void AddInterceptedSingleton<TIService, TService, TInterceptor>(this IServiceCollection services)
where TIService : class
where TService : class, TIService
where TInterceptor : class, IInterceptor
{
services.TryAddSingleton<IProxyGenerator, ProxyGenerator>();
services.AddSingleton<TService>();
services.TryAddTransient<TInterceptor>();
services.AddSingleton(provider =>
{
var proxyGenerator = provider.GetRequiredService<IProxyGenerator>();
var service = provider.GetRequiredService<TService>();
var interceptor = provider.GetRequiredService<TInterceptor>();
return proxyGenerator.CreateInterfaceProxyWithTarget<TIService>(service, interceptor);
});
}
}
效果如下:
想要更快更方便的了解相关知识,可以关注微信公众号

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2017-12-05 继承与派生