博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABP中的拦截器之EntityHistoryInterceptor
阅读量:5030 次
发布时间:2019-06-12

本文共 4223 字,大约阅读时间需要 14 分钟。

  今天我们接着之前的系列接着来写另外一种拦截器EntityHistoryInterceptor,这个拦截器到底是做什么的呢?这个从字面上理解是实体历史?这个到底是什么意思?带着这个问题我们来一步步去分析。

  整个拦截器的运行过程和前面几篇是一样的,这里就不再赘述,首先也是在AbpBootstrapper的构造函数中完成初始化过程。

private void AddInterceptorRegistrars()        {            ValidationInterceptorRegistrar.Initialize(IocManager);            AuditingInterceptorRegistrar.Initialize(IocManager);            EntityHistoryInterceptorRegistrar.Initialize(IocManager);            UnitOfWorkRegistrar.Initialize(IocManager);            AuthorizationInterceptorRegistrar.Initialize(IocManager);        }

  首先我们来从这个Initialize方法来进行说明,然后再来一步步分析。

internal static class EntityHistoryInterceptorRegistrar    {        public static void Initialize(IIocManager iocManager)        {            iocManager.IocContainer.Kernel.ComponentRegistered += (key, handler) =>            {                if (!iocManager.IsRegistered
()) { return; } var entityHistoryConfiguration = iocManager.Resolve
(); if (ShouldIntercept(entityHistoryConfiguration, handler.ComponentModel.Implementation)) { handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(EntityHistoryInterceptor))); } }; } private static bool ShouldIntercept(IEntityHistoryConfiguration entityHistoryConfiguration, Type type) { if (type.GetTypeInfo().IsDefined(typeof(UseCaseAttribute), true)) { return true; } if (type.GetMethods().Any(m => m.IsDefined(typeof(UseCaseAttribute), true))) { return true; } return false; } }

  这个还是和之前一样去订阅IOC容器中的IocContainer.Kernel.ComponentRegistered这个事件,然后在整个ABP框架运行并将每一个接口对应的类型注册到IOC容器的视乎会调用上面订阅的方法。然后在订阅方法中首先判断IOC容器中是否注册过IEntityHistoryConfiguration这个接口,如果没有注册过那么就直接返回了?那么ABP框架到底有没有注册过这个接口呢?

  这个在ABP中的AbpBootstrapper的Initialize方法中就完成了注册,具体的过程就不再描述,重点的是下面这句代码。

Component.For
().ImplementedBy
().LifestyleSingleton()

  这个在ABP系统中注册了唯一的一个单例实现EntityHistoryConfiguration这个类,我们来看看这个类的实现。

internal class EntityHistoryConfiguration : IEntityHistoryConfiguration    {        public bool IsEnabled { get; set; }        public bool IsEnabledForAnonymousUsers { get; set; }        public IEntityHistorySelectorList Selectors { get; }        public List
IgnoredTypes { get; } public EntityHistoryConfiguration() { IsEnabled = true; Selectors = new EntityHistorySelectorList(); IgnoredTypes = new List
() { typeof(EntityChangeSet), typeof(EntityChange), typeof(EntityPropertyChange) }; } }

  我们先不分析这个类到底为了配置些什么,我们接着看EntityHistoryInterceptorRegistrar这个类,在这个类中是否启用拦截,就看当前类型Type中是否定义了自定义属性 UseCaseAttribute,这个属性可以在类上面,也可以定义在类里面的方法中,如果这些类型或者类型里面的方法定义了这个自定义属性,那么就启动后面的拦截过程了,这里面这些类通常是定义在应用层或领域层中的具体和业务相关的类。在判断了这些之后就是添加我们的EntityHistoryInterceptor拦截器了。

  下面我们就来重点分析EntityHistoryInterceptor这个拦截器了。

internal class EntityHistoryInterceptor : IInterceptor    {        public IEntityChangeSetReasonProvider ReasonProvider { get; set; }        public EntityHistoryInterceptor()        {            ReasonProvider = NullEntityChangeSetReasonProvider.Instance;        }        public void Intercept(IInvocation invocation)        {            var methodInfo = invocation.MethodInvocationTarget;            var useCaseAttribute = methodInfo.GetCustomAttributes(true).OfType
().FirstOrDefault() ?? methodInfo.DeclaringType.GetCustomAttributes(true).OfType
().FirstOrDefault(); if (useCaseAttribute?.Description == null) { invocation.Proceed(); return; } using (ReasonProvider.Use(useCaseAttribute.Description)) { invocation.Proceed(); } } }

  在这个拦截器中,如果一个已拦截的方法在执行前首先会执行Intercept这个方法,在这个方法中我们会往其中的字段Description中添加描述,然后会执行ReasonProvider.Use这个方法,然后将之前的描述Description作为参数进行传递。

转载于:https://www.cnblogs.com/seekdream/p/9886072.html

你可能感兴趣的文章
git常见问题
查看>>
.NETFramework:template
查看>>
HM16.0之帧内模式——xCheckRDCostIntra()函数
查看>>
Jmeter性能测试 入门
查看>>
安卓动画有哪几种?他们的区别?
查看>>
Nodejs学习总结 -Express入门(一)
查看>>
ssh 连接原理及ssh-keygen
查看>>
vs2013编译qt程序后中文出现乱码
查看>>
【转】IOS数据库操作SQLite3使用详解
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
Web项目中的路径问题
查看>>
js随机数的取整
查看>>
十大经典预测算法(六)---集成学习(模型融合算法)
查看>>
用php做一个简单的注册用户功能
查看>>
一款基于css3的3D图片翻页切换特效
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sizeof与Strlen的区别与联系
查看>>