个人域名备案快的网站,上海 网站 备案,网站建设公司 提成,seo优化销售在asp.net mvc或asp.net miniapi中#xff0c;有过滤器#xff0c;可以在请求前或后增加一层#xff0c;达到验证#xff0c;过滤等作用#xff0c;如果在Service的方法前后加一层呢#xff1f;这里介绍一下Castle.DynamicProxy的用法。首先引入Castle.Core实现代码相对轻… 在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.AddInterceptedSingletonITestService, 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 ILoggerTestService _logger;public TestService(ILoggerTestService logger){_logger logger;}public string Get(int id){_logger.LogInformation(TestService.Get({id}), id);return OK;}
}
public class AddLogInterceptor : IInterceptor
{private readonly ILoggerAddLogInterceptor _logger;public AddLogInterceptor(ILoggerAddLogInterceptor 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 AddInterceptedSingletonTIService, TService, TInterceptor(this IServiceCollection services)where TIService : classwhere TService : class, TIServicewhere TInterceptor : class, IInterceptor{services.TryAddSingletonIProxyGenerator, ProxyGenerator();services.AddSingletonTService();services.TryAddTransientTInterceptor();services.AddSingleton(provider {var proxyGenerator provider.GetRequiredServiceIProxyGenerator();var service provider.GetRequiredServiceTService();var interceptor provider.GetRequiredServiceTInterceptor();return proxyGenerator.CreateInterfaceProxyWithTargetTIService(service, interceptor);});}
}效果如下