PreInitialize

IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar());

增加BasicConventionRegister, 在这里只是添加这种 基本的注册方式,翻译的不好有点扰,其主要是告诉Ioc在后面的注册的时候关注三种类型

ITransientDependency

ISingletonDependency

IInterceptor

意味着只要你定义的类加了上面任意一个接口,就会被Abp的框架自动注册到Ioc,

但是这里只是告诉Ioc有这种注册方式,真正的注册并不是在这里。

 

ValidationInterceptorRegistrar.Initialize(IocManager);

internal static class ValidationInterceptorRegistrar
{
public static void Initialize(IIocManager iocManager)
{
iocManager.IocContainer.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
} private static void Kernel_ComponentRegistered(string key, IHandler handler)
{
if (typeof(IApplicationService).IsAssignableFrom(handler.ComponentModel.Implementation))
{
handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(ValidationInterceptor)));
}
}
}

这段代码很有意思, 其意思是说当Ioc中有组件被注册的时候(也就是往Ioc添加某个类型的时候), 检测该对象是否是IApplicationService(也就是只验证ApplicationService层), 是的话做Validation的拦截,可以做到拦截之后对ApplicationService层的方法参数做检测, Interceptors是一个拦截器集合, 可以加入更多的拦截器,比如方法调用日志监控横切面的操作。

所以当一个请求进入ApplicationService层之后,第一个做的事情就是 Validation.

跳过Validation的条件 :

DisableValidationAttribute, 仅可添加在方法上面

非Public方法

参数为空

验证失败会抛出: AbpValidationException异常,并带有验证失败的详细字段及错误信息

最后如果参数里面的某个属性定义添加了IShouldNormalize接口,还会调用IShouldNormalize的Normalize方法,做一些数据规范化的操作,目前还没想出来有啥用。

 

FeatureInterceptorRegistrar.Initialize(IocManager);

其针对所有的Ioc里面的对象,这个拦截器拦截的要素有2点:

a. 类上有RequiresFeatureAttribute

b. 类里面的某个某个方法有RequiresFeatureAttribute

这个看起来像一个比较通用的功能性的检查,应该是为一个小的扩展功能存在的, 目前没用到,暂时忽略.

 

AuditingInterceptorRegistrar.Initialize(IocManager);

审计拦截器,很有用的数据拦截, 其主要作用就是记录拦截到的方法调用的数据。

拦截规则:

private static bool ShouldIntercept(Type type)
{
if (_auditingConfiguration.Selectors.Any(selector => selector.Predicate(type)))
{
return true;
} if (type.IsDefined(typeof(AuditedAttribute), true)) //TODO: true or false?
{
return true;
} if (type.GetMethods().Any(m => m.IsDefined(typeof(AuditedAttribute), true))) //TODO: true or false?
{
return true;
} return false;
}

可以看到除了第一条做了一个扩展规则之外,其余两条都是通过AuditedAttribute来处理的.

关于Selectors的选择器, 我们紧接着可以看到下面的代码:

也只是针对IApplicationService层的方法做了审计拦截.

至此应该明白 Abp的审计是如何做的了吧.

 

但是看似这个功能很好,难免也会有特殊癖好的人思考如何关掉这么有用的功能, 看AuditingInterceptorRegistrar的类里面Initialize方法

public static void Initialize(IIocManager iocManager)
{
_auditingConfiguration = iocManager.Resolve<IAuditingConfiguration>(); if (!_auditingConfiguration.IsEnabled)
{
return;
} iocManager.IocContainer.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
}

写明了_auditingConfiguration.IsEnable来判断是否启用,但是这个方法本身就是在AbpKernel中执行的,请问在何处可以设置这个值呢?

通过上篇的应用程序生命周期的分析,

protected virtual void Application_Start(object sender, EventArgs e)
{
AbpBootstrapper.IocManager.RegisterIfNot<IAssemblyFinder, WebAssemblyFinder>();
AbpBootstrapper.Initialize();
}

但是IAuditingConfiguration的注册及本方法的Init都是在Initizlize这个方法中,如果你使用的是非Abp的源代码,貌似没有办法做到关闭, 所以上面关闭Abp 默认Auditing功能的答案是否定的,待后续找作者处理(这个已联系作者处理: https://github.com/aspnetboilerplate/aspnetboilerplate/issues/721)。

审计日志的保存:

 

UnitOfWorkRegistrar.Initialize(IocManager);

Uow的拦截注册

可以看到默认情况下拦截两种:

1. 所有有IRepository接口跟IApplicationService的类

2. 所有的加了UnitOfWorkAttribute的方法

 

AuthorizationInterceptorRegistrar.Initialize(IocManager);

这个可以实现Service层方法的授权检查, 没怎么用,忽略.

 

其他

Configuration.Settings.Providers.Add<EmailSettingProvider>();

Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.SoftDelete, true);
Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MustHaveTenant, true);
Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MayHaveTenant, true); ConfigureCaches();

EmailSetting 邮件设置

SoftDelete: 软删除设置

MustHaveTenant: 多租户设置

MayHaveTenant:

Caches: 缓存策略设置

AbpKernelModule的更多相关文章

  1. ABP框架详解(二)AbpKernelModule

    AbpKernelModule类是Abp框架自己的Module,它也跟所有其他的Module一样继承自AbpModule,重写PreInitialize,Initialize,PostInitiali ...

  2. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

  3. ABP源码分析六:依赖注入的实现

    ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...

  4. ABP源码分析七:Setting 以及 Mail

    本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting. 首先区分一下ABP中的Setting和Configuration. Setting一般用于需要通过外部配置文件(或数据 ...

  5. ABP源码分析九:后台工作任务

    文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob).ABP通过BackgroundWorkerManager来管理Backgr ...

  6. ABP源码分析十:Unit Of Work

    ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...

  7. ABP源码分析十七:DTO 自动校验的实现

    对传给Application service对象中的方法的DTO参数,ABP都会在方法真正执行前自动完成validation(根据标注到DTO对象中的validate规则). ABP是如何做到的? 思 ...

  8. ABP源码分析十九:Auditing

    审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作. AuditInfo:定义如下图中需要被Audit的信息. Aud ...

  9. ABP源码分析二十二:Navigation

    MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...

随机推荐

  1. ORM小练习代码

    DOG类 namespace RupengORM { public class Dog { public Dog() { } /// <summary> /// 显示提供无参构造函数 // ...

  2. hbase 1.1.7在centor6.5安装过程

    1.自己安装的最新版一直没成功,换成了1.1.7稳定版的.中间遇到的问题记录下 1) jdk 用的1.7版本的,安装过程省略. 2)下载hbase  zip包:https://mirrors.tuna ...

  3. WCF学习之旅—WCF概述(四)

    一.WCF概述 1) 什么是WCF? Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终 ...

  4. java compiler level does not match the version of the installed java project facet 解决方案

    项目出现 java compiler level does not match the version of the installed java project facet 错误,一般是项目移植出现 ...

  5. Leetcode-206 Reverse Linked List

    #206.  Reverse Linked List Reverse a singly linked list. /** * Definition for singly-linked list. * ...

  6. 基于redis实现可靠的分布式锁

    什么是锁 今天要谈的是如何在分布式环境下实现一个全局锁,在开始之前先说说非分布式下的锁: 单机 – 单进程程序使用互斥锁mutex,解决多个线程之间的同步问题 单机 – 多进程程序使用信号量sem,解 ...

  7. Unity3D知识框架

    美术部分:           3d模型,材质,纹理,shader,Animator,Animation,天空盒,灯光效果,烘焙 程序部分:           基本组成:               ...

  8. 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  9. Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)

    本节我们讨论 volume 的 Backup 操作. Backup 是将 volume 备份到别的地方(备份设备),将来可以通过 restore 操作恢复. Backup VS Snapshot 初看 ...

  10. 窥探Swift之新添数据类型元组与可选值

    今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些 ...