AbpKernelModule
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();
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的更多相关文章
- ABP框架详解(二)AbpKernelModule
AbpKernelModule类是Abp框架自己的Module,它也跟所有其他的Module一样继承自AbpModule,重写PreInitialize,Initialize,PostInitiali ...
- ABP源码分析三:ABP Module
Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...
- ABP源码分析六:依赖注入的实现
ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...
- ABP源码分析七:Setting 以及 Mail
本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting. 首先区分一下ABP中的Setting和Configuration. Setting一般用于需要通过外部配置文件(或数据 ...
- ABP源码分析九:后台工作任务
文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob).ABP通过BackgroundWorkerManager来管理Backgr ...
- ABP源码分析十:Unit Of Work
ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...
- ABP源码分析十七:DTO 自动校验的实现
对传给Application service对象中的方法的DTO参数,ABP都会在方法真正执行前自动完成validation(根据标注到DTO对象中的validate规则). ABP是如何做到的? 思 ...
- ABP源码分析十九:Auditing
审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作. AuditInfo:定义如下图中需要被Audit的信息. Aud ...
- ABP源码分析二十二:Navigation
MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...
随机推荐
- How.To.Process.Image.Infomation.Of.Rotate.And.Flip.From.Server
需求说明 客户端接收到服务器传送过来的图像数据,客户端通过对图像进行旋转和反转操作. 然后把这个旋转和反转的数据上传到服务器. 客户端在接收图像的时候, 也会下载以前的旋转和反转参数, 然后客户端根据 ...
- Hystrix框架2--超时
timeout 在调用第三方服务时有些情况需要对服务响应时间进行把控,当超时的情况下进行fallback的处理 下面来看下超时的案例 public class CommandTimeout exten ...
- 基于1.3.3版本tooltip的datagrid单元格tip实现
基于1.3.3版本tooltip的datagrid单元格tip实现 2013年05月25日 ⁄ datagrid ⁄ 共 6122字 ⁄ 评论数 26 ⁄ 被围观 7,033 views+ 文章目录 ...
- Angular使用$compile为从Ajax加载的HTML绑定ng-click事件
这是一个Angular使用$compile为从Ajax加载的HTML绑定ng-click事件的实现方式,由于近期忙碌,就先放代码.代码如下: <table data-ng-table=" ...
- JS原生第八篇 (帅哥)
1.1 复习 1. clientX clientWidth 可视区域的宽度 clientWidth width + padding offsetWidth ...
- MongoDB 搭建副本集
副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary ...
- LINQ系列:LINQ to XML操作
LINQ to XML操作XML文件的方法,如创建XML文件.添加新的元素到XML文件中.修改XML文件中的元素.删除XML文件中的元素等. 1. 创建XML文件 string xmlFilePath ...
- Objective-C中的集合类
下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习. 在Obj ...
- T-Sql学习系列完结
T-Sql(一)简单语法 T-Sql(二)事务(Transaction) T-Sql(三)存储过程(Procedure) T-Sql(四)表关联和视图(view) T-Sql(五)xml操作 T-Sq ...
- geotrellis使用(八)矢量数据栅格化
目录 前言 栅格化处理 总结 参考链接 一.前言 首先前几天学习了一下Markdown,今天将博客园的编辑器改为Markdown,从编写博客到界面美观明显都清爽多了,也能写出各种样式的东 ...