首页 > 其他分享 >Castle.DynamicProxy拦截器

Castle.DynamicProxy拦截器

时间:2022-12-05 21:00:20浏览次数:40  
标签:DynamicProxy 拦截器 class public var app invocation Castle logger

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

效果如下:

Castle.DynamicProxy拦截器_Castle.DynamicProxy拦

  想要更快更方便的了解相关知识,可以关注微信公众号 

Castle.DynamicProxy拦截器_Castle.DynamicProxy拦_02

 

标签:DynamicProxy,拦截器,class,public,var,app,invocation,Castle,logger
From: https://blog.51cto.com/axzxs/5913290

相关文章

  • spring mvc中的拦截器小结
    在springmvc中,拦截器其实比较简单了,下面简单小结并demo下。preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们......
  • bouncycastle安装配置
    bouncycastle简介bouncycastle(轻量级密码术包)是一种用于Java平台的开放源码的轻量级密码术包;它支持大量的密码术算法,并提供JCE1.2.1的实现。bouncycastle安装环境......
  • 使用Mybatis拦截器实现分页功能
     最近在做项目的时候,想要脱离Mybatis-Plus带来的便利,于是用回Mybatis,现在先记录下用Mybatis的拦截器来统一处理分页的简单方法。一、定义下分页信息的包装类importlom......
  • SpringBoot 适配 MyBatis 分页插件功能(自定义拦截器方式)
    文章目录​​1.自定义分页插件​​​​1.1.application.properties添加mybatis属性​​​​1.2.mybatis-config.xml配置文件​​​​1.3.分页拦截器类PagePlugin​......
  • spring mvc环境之监听器、过滤器、拦截器(六)
    1.监听器Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。......
  • cxf中自定义拦截器限制IP
    importjava.util.List;importjavax.servlet.http.HttpServletRequest;importorg.apache.cxf.interceptor.Fault;importorg.apache.cxf.message.Message;importorg.apac......
  • struts2 中的拦截器例子快速进阶
    小结了struts2中拦截器的一个例子,以方便快速进阶的.比如有个很典型的例子,要求在编辑数据或者增加数据前,必须要先判断用户是否登陆.则我们先在src目录下,建一个包strut......
  • SpringCloud(八) - 自定义token令牌,鉴权(注解+拦截器),参数解析(注解+解析器)
    1、项目结构介绍项目有使用到,redis和swagger,不在具体介绍;2、手动鉴权和用户信息参数获取(繁杂,冗余)2.1用户实体类/***CreatedOn:4/11/2022.*<p>*Author......
  • day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语
    springMVC调度器-DispatcherServlet-SpringMVC框架的入口定义DispatcherServlet成为调度器,配置在web.xml文件中,用于拦截匹配的请求。并解析请求url,将请求分发给对应......
  • Spring拦截器
    自定义拦截器步骤1 创建拦截器类实现HandlerInterceptor@ControllerpublicclassTargetController{@RequestMapping("/target")publicMo......