AbpKernelModule类是Abp框架自己的Module,它也跟所有其他的Module一样继承自AbpModule,重写PreInitialize,Initialize,PostInitialize三个主要成员,在所有Module的基类AbpModule中已经拥有了IIocManager和IAbpStartupConfiguration的受保护的成员,所以后面所有的Module都可以直接获取并使用相关的功能,AbpModule同时提供了两个非常有用的公有静态方法public static bool IsAbpModule(Type type)和public static List<Type> FindDependedModuleTypes(Type moduleType),顾名思义第一个方法用于判断一个类型是否是Module类型,另一个用于根据指定的类型查找器所有依赖的Module。

  1. PreInitialize()方法,方法内第一步是约定需要被注册的类型

    IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar());

    BasicConventionalRegistrar继承自IConventionalDependencyRegistrar,在RegisterAssembly方法体中注册所有ITransientDependency,ISingletonDependency,IInterceptor的实现类,这是非常有用的,在后面自己的应用程序或者其他程序集中就可以只需要实现上面三个接口,无需再做任何事情,就会被注册到依赖容器中,使用的时候直接Resolve就可以使用了,实现类以单例模式被注册或者瞬态方式被注册。如果被注册的类直接或者间接实现IInitializable接口那么在第一次被实例化的时候同时会被初始化。

   在Castle的依赖容器中每一个类型被注册的时候都会触发IWindsorContainer.Kernel.ComponentRegistered委托,所以就可以在写一   些逻辑判断当前被注册的类是否满足条件,决定是否需要为注册类添加拦截器实现AOP。

   (1)ValidationInterceptorRegistrar就是用来实现以上功能的一个实践,从名称上可以看出该类是用来注册验证拦截器的,这是一    个静态类  他们通常会定义一个公共静态的Initialize(IIocManager iocManager)方法来被调用,默认是为所有    IApplicationService的实现类添加ValidationInterceptor拦截器,拦截器的内部会new一个MethodInvocationValidator的新实例调用该实例的Validate()方法,构造函数传递IApplicationService被调用方法的MethodInfo和参数值,如果MethodInfo是非公有,或者应用了DisableValidationAttribute,还有参数值为空的话就不做任何验证,将被验证的参数必须继承IValidate否则整个验证就结束,可以实现ICustomValidate,系统会进行执行验证,同时应用了ValidationAttribute的话也会被执行,所有产生的错误会被添加到一个结果集合中,如果验证结果集合中存在项就会抛异常,最后验证ok,所有实现了IShouldNormalize的参数会被执行Normalize()方法。

   (2)FeatureInterceptorRegistrar是为所有被注册到依赖容器中应用了RequiresFeatureAttribute或者其任意方法应用了该特性的类添加FeatureInterceptor拦截器,收集方法和类上定义的所有RequiresFeatureAttribute,调用依赖容器中的IFeatureChecker迭代调用RequiresFeatureAttribute,确保方法是否可用。

private void CheckFeatures(IEnumerable<RequiresFeatureAttribute> featureAttributes){_iocResolver.Using<IFeatureChecker>(featureChecker =>{foreach (var featureAttribute in featureAttributes){featureChecker.CheckEnabled(featureAttribute.RequiresAll, featureAttribute.Features);}});}

  (3)AuditingInterceptorRegistrar用于决定方法的执行是否需要被审计记录,从容器中获取IAuditingConfiguration如果IsEnabled为true,被注册的类满足IAuditingConfiguration的Selectors中任意一个Predicate委托,或者类或者当前MethodTarget上应用了AuditedAttribute就执行审计记录,也即添加AuditingInterceptor拦截器,收集被调用方法的名称参数调用时间,执行持续时间,执行人等等信息,使用IAuditingStore执行持久化操作。

  (4)UnitOfWorkRegistrar通过判断被执行的类或方法是否需要包含在一个事务中被执行,默认IRepository和IApplicationService是需要被事务执行的当然任意方法应用了UnitOfWorkAttribute也会被当做事务实行,事务的实现机制以AOP的形式封装在UnitOfWorkInterceptor中,在拦截器执行的时候会优先判断当前线程槽中是否已经保存了一个事务GUID(通过GUID可以在事务的一个静态字典中找到相应的IActiveUnitOfWork)并且没有执行过Dispose,如果以上条件满足就什么也不做(继续应用调用者的事务上下文),否则获取应用的UnitOfWorkAttribute特性(必须不为空并且IsDisabled属性为false)或者new一个默认的UnitOfWorkAttribute,使用此特性创建UnitOfWorkOptions开启一个新的上下文执行环境_unitOfWorkManager.Begin(options),执行完毕后通过单元工作完成句柄释放相关事务上下文。

  (5)AuthorizationInterceptorRegistrar为IApplicationService的应用服务层的调用进行权限验证拦截器,如果需要真正执行权限验证的话还需要为IApplicationService的类或者方法应用AbpAuthorizeAttribute特性,依赖容器解析出一个IAuthorizeAttributeHelper的实例,递归调用AbpAuthorizeAttribute实例,判断是否具有权限执行IApplicationService的方法

  (6)为IApplicationServeice的实现类添加审计功能

Configuration.Auditing.Selectors.Add(new NamedTypeSelector("Abp.ApplicationServices",type => typeof(IApplicationService).IsAssignableFrom(type)));

  (7)添加系统默认Setting,以及为UnitOfWork中所有数据库访问添加默认过滤机制

Configuration.Settings.Providers.Add<LocalizationSettingProvider>();Configuration.Settings.Providers.Add<EmailSettingProvider>();Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.SoftDelete, true);Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MustHaveTenant, true);Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MayHaveTenant, true);

  (8)ConfigureCaches()方法为三种不同级别的缓存设置不同的SlidingExpireTime,系统级的为8小时,租户级的为1小时,某个用户级的为20分钟

Configuration.Caching.Configure(AbpCacheNames.ApplicationSettings, cache =>{cache.DefaultSlidingExpireTime = TimeSpan.FromHours(8);});Configuration.Caching.Configure(AbpCacheNames.TenantSettings, cache =>{cache.DefaultSlidingExpireTime = TimeSpan.FromMinutes(60);});Configuration.Caching.Configure(AbpCacheNames.UserSettings, cache =>{cache.DefaultSlidingExpireTime = TimeSpan.FromMinutes(20);});

  1. Initialize()方法,同很多其他的Web开发框架一样,Abp也提供了自己的EventBus事件处理机制,在Abp的Module的Initialize()方法中注册EventBusInstaller : IWindsorInstaller,Install方法会优先判断IEventBusConfiguration.UseDefaultEventBus是否为true,如果是就注册一个默认的静态的EventBus实例,否则注册一个新的EventBus,为所有即将注册到依赖容器中并且实现了IEventHandler接口的类封装成一个IocHandlerFactory,注册到EventBus中(拿到的所有即将被注册的IEventHandler的实现类获取具有一个泛型参数的子接口,该泛型参数就是事件类型将作为key注册到EventBus中)。
  2. 传递Abp的程序集作为参数执行IocManager所有约定注册机。完成相关类型的自动注册到容器中(不要注册Abp中IWindsorInstaller的实现类)。
  3. PostInitialize()方法,为一些缺省的类型注册默认Null实现类
    IocManager.RegisterIfNot<IUnitOfWork, NullUnitOfWork>(DependencyLifeStyle.Transient);IocManager.RegisterIfNot<IAuditInfoProvider, NullAuditInfoProvider>(DependencyLifeStyle.Singleton);IocManager.RegisterIfNot<IAuditingStore, SimpleLogAuditingStore>(DependencyLifeStyle.Transient);IocManager.RegisterIfNot<ITenantIdResolver, NullTenantIdResolver>(DependencyLifeStyle.Singleton);IocManager.RegisterIfNot<IAbpSession, ClaimsAbpSession>(DependencyLifeStyle.Singleton);

  4. 解析并初始化相关管理类
    IocManager.Resolve<SettingDefinitionManager>().Initialize();IocManager.Resolve<FeatureManager>().Initialize();IocManager.Resolve<NavigationManager>().Initialize();IocManager.Resolve<PermissionManager>().Initialize();IocManager.Resolve<LocalizationManager>().Initialize();

转载于:https://www.cnblogs.com/Azula/p/4989157.html

ABP框架详解(二)AbpKernelModule相关推荐

  1. ABP框架详解(三)Domain

    此处的Domain主要指Abp类库根目录下Domain文件夹.顾名思义该目录下是用来存放与领域实体,领域逻辑执行,存储,领域服务相关的内容. 1.Entities (1)为整个Abp框架后期开发的所有 ...

  2. ABP框架详解(八)动态ApiController的生成和访问机制

    在ABP框架中提供了一套动态生成ApiController的机制(依然支持原生ApiController的使用方式),虽然说是动态生成ApiController但是实际上并没有真正在启动程序的时候生成 ...

  3. ABP框架详解(一)ABPBootstrapper

    在ABP框架的AbpBootstrapper主要用于框架的基本配置的注册和初始化,在Web应用启动阶段实例化一个AbpBootstrapper并调用Initialize方法初始化,该类主要包含两个公有 ...

  4. ABP框架详解(六)Aspects

    这种AOP式的设计非常类似于Asp.net MVC和WebApi中过滤器(Filter)机制,感觉没有太多可讲述的,只能谈谈设计思路. 框架中AspectAttribute特性用于设置到需要被拦截的T ...

  5. Linux内核Thermal框架详解十二、Thermal Governor(2)

    本文部分内容参考 万字长文 | Thermal框架源码剖析, Linux Thermal机制源码分析之框架概述_不捡风筝的玖伍贰柒的博客-CSDN博客, "热散由心静,凉生为室空" ...

  6. Pytest框架详解(二)

    Pytest框架详解(二) 文章目录 Pytest框架详解(二) 一.引言 二.参数化 列表嵌套元组 三.标记 3.1显式指定 3.2模糊匹配 3.3pytest.mark 四.配置文件 五.依赖 六 ...

  7. jQuery Validate验证框架详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.导入js库 <script type="text/javascript" src="& ...

  8. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    深入浅出 Cocoa 之 Core Data(1)- 框架详解 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 Core data 是 Cocoa 中处 ...

  9. WebDriver自动化测试框架详解

    webDriver自动化测试框架详解 一. 简介 WebDriver API相对于Selenium Remote Control API来说,虽然同样是控制浏览器,但它的编程接口更加简洁 WebDri ...

最新文章

  1. f-free 查看系统中空闲和使用的内存
  2. web应用的绝对路径和相对路径
  3. IE6动态插入option
  4. 用户手撕锤子产品总监引10万人围观,竟还拿到了Offer
  5. 算法笔记_065:分治法求逆序对(Java)
  6. Vue基本使用---vue工作笔记0002
  7. C++标识符的命名规则
  8. 4.CND技术详解---集群服务与负载均衡技术
  9. Cadence画PCB的傻瓜式教程
  10. 数据结构与算法(总结)
  11. win10安装python27_《win10python27安装教程》 win10怎么安装python
  12. Android常用Qualifiers(限定符)
  13. Android:给图片加边框
  14. 用C++语言写游戏——打飞机
  15. FPGA DVB-S2 FEC 信道译码 BCH译码器 LDPC译码器 解交织器 IP core
  16. 软件测试怎么样才能提高自己的效率?
  17. java通信—网络聊天室网络画板(简陋版)
  18. windows下mysql免安装配置
  19. 对极验geetest滑块验证码图片还原算法的研究
  20. avformat_open_input返回-1094995529 “Invalid data found when processing input“

热门文章

  1. 目标跟踪算法——HCF:Hierarchical Convolutional Features for Visual Tracking
  2. PNAS:青年时期人脑网络结构-功能耦合的发展
  3. msp430g2553+pcf8574+dht11+lcd1602
  4. IDEA去掉屏幕中间的白色竖线
  5. 安装mayavi出错
  6. 【听】谁动了我的奶酪,寻找真正属于自己的奶酪
  7. 选频方波放大电路设计
  8. 14.3 shell函数返回值
  9. java中引用jgit_JAVA使用jgit编写的git客户端
  10. 43页县域农业大数据运营服务中心方案介绍