IProxyTypeFactory
用来生成代理类型,默认提供了基于 Emit 动态代理的实现,基于接口设计,可以扩展为其他实现方式
接口定义如下:
public interface IProxyTypeFactory
{
Type CreateProxyType(Type serviceType);
Type CreateProxyType(Type serviceType, Type implementType);
}
IProxyFactory
用来生成代理实例,默认实现是基于 IProxyTypeFactory
生成代理类型之后创建实例
接口定义如下:
public interface IProxyFactory
{
object CreateProxy(Type serviceType, object[] arguments);
object CreateProxy(Type serviceType, Type implementType, params object[] arguments);
object CreateProxyWithTarget(Type serviceType, object implement, object[] arguments);
}
IInvocation
执行上下文,默认实现就是方法执行的上下文,包含了代理方法信息、被代理的方法信息、方法参数,返回值以及用来自定义扩展的一个 Properties
属性
public interface IInvocation
{
MethodInfo ProxyMethod { get; }
object ProxyTarget { get; }
MethodInfo Method { get; }
object Target { get; }
object[] Arguments { get; }
Type[] GenericArguments { get; }
object ReturnValue { get; set; }
Dictionary<string, object> Properties { get; }
}
IInterceptor
拦截器,用来定义公用的处理逻辑,方法拦截处理方法
接口定义如下:
public interface IInterceptor
{
Task Invoke(IInvocation invocation, Func next);
}
invocation
是方法执行的上下文,next
代表后续的逻辑处理,类似于 asp.net core 里的 next
,如果不想执行方面的方法不执行 next
逻辑即可
IInterceptorResolver
用来根据当前的执行上下文获取到要执行的拦截器,默认是基于 FluentAPI 的实现,但是如果你特别想用基于 Attribute 的也是可以的,默认提供了一个 AttributeInterceotorResovler
,你也可以自定义一个适合自己的 InterceptorResolver
public interface IInterceptorResolver
{
IReadOnlyList ResolveInterceptors(IInvocation invocation);
}
IInvocationEnricher
上面 IInvocation
的定义中有一个用于扩展的 Properties
,这个 enricher
主要就是基于 Properties
来丰富执行上下文信息的,比如说记录 TraceId
等请求链路追踪数据,构建方法执行链路等
public interface IEnricher
{
void Enrich(TContext context);
}
public interface IInvocationEnricher : IEnricher
{
}
AspectDelegate
AspectDelegate
是用来将构建要执行的代理方法的方法体的,首先执行注册的 InvocationEnricher
,丰富上下文信息,然后根据执行上下文获取要执行的拦截器,构建一个执行委托,生成委托使用了之前分享过的 PipelineBuilder
构建中间件模式的拦截器,执行拦截器逻辑
// apply enrichers
foreach (var enricher in FluentAspects.AspectOptions.Enrichers)
{
try
{
enricher.Enrich(invocation);
}
catch (Exception ex)
{
InvokeHelper.OnInvokeException?.Invoke(ex);
}
}
// get delegate
var builder = PipelineBuilder.CreateAsync(completeFunc);
foreach (var interceptor in interceptors)
{
builder.Use(interceptor.Invoke);
}
return builder.Build();
更多信息可以参考源码: https://github.com/WeihanLi/WeihanLi.Common/blob/dev/src/WeihanLi.Common/Aspect/AspectDelegate.cs
使用示例
推荐和依赖注入结合使用,主要分为以微软的注入框架为例,有两种使用方式,一种是手动注册代理服务,一种是自动批量注册代理服务,来看下面的实例就明白了
手动注册代理服务
使用方式一,手动注册代理服务:
为了方便使用,提供了一些 AddProxy
的扩展方法:
IServiceCollection services = new ServiceCollection();
services.AddFluentAspects(options =>
{
// 注册拦截器配置
options.NoInterceptProperty(f => f.Name);
options.InterceptAll()
.With()
;
options.InterceptMethod(x => x.Name == nameof(DbContext.SaveChanges)
|| x.Name == nameof(DbContext.SaveChangesAsync))
.With()
;
options.InterceptMethod(f => f.Fly())
.With();
options.InterceptType()
.With();
// 注册 InvocationEnricher
options
.WithProperty(“TraceId”, “121212”)
;
});
// 使用 Castle 生成代理
services.AddFluentAspects(options =>
{
// 注册拦截器配置
options.NoInterceptProperty(f => f.Name);
options.InterceptAll()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
![](https://i-blog.csdnimg.cn/blog_migrate/68bf470bc38308d6a30acd5cc98bd2d9.jpeg)
最后
资料过多,篇幅有限,需要文中全部资料可以点击这里免费获取前端面试资料PDF完整版!
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。
2318734421)]
[外链图片转存中…(img-SsAJAMvV-1712318734421)]
资料过多,篇幅有限,需要文中全部资料可以点击这里免费获取前端面试资料PDF完整版!
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。