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();
}); Configuration.Caching.Configure(AbpCacheNames.TenantSettings, cache =>
{
cache.DefaultSlidingExpireTime = TimeSpan.FromMinutes();
}); Configuration.Caching.Configure(AbpCacheNames.UserSettings, cache =>
{
cache.DefaultSlidingExpireTime = TimeSpan.FromMinutes();
});
  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();

ABP框架详解(二)AbpKernelModule的更多相关文章

  1. Shiro 安全框架详解二(概念+权限案例实现)

    Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...

  2. ABP框架详解(四)Feature

    ABP框架中存在一个Feature的特性,功能和设计思路非常类似于框架中的Authorization功能,都是来控制用户是否能够继续操作某项功能,不同点在于Authorization默认是应用在IAp ...

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

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

  4. ABP框架详解(七)Caching

    在ABP框架中存在一个缓存机制,使用ICache的继承类来存储最终需要缓存的数据,可以吧ICache看成一个字典对象,使用Key作为真实数据的具有唯一性的表示.使用上与字典对象完全相同,Get方法传递 ...

  5. ABP框架详解(五)Navigation

    ABP框架中的Navigation功能用于管理业务系统中所有可用的菜单导航控件,通常在业务系统的首页会有一个全局性的导航菜单,JD商城,天猫,猪八戒网莫不如是.所以为方便起见,Navigation功能 ...

  6. ABP框架详解(三)Domain

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

  7. ABP框架详解(一)ABPBootstrapper

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

  8. ABP框架详解(六)Aspects

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

  9. Shiro 安全框架详解一(概念+登录案例实现)

    shiro 安全框架详细教程 总结内容 一.RBAC 的概念 二.两种常用的权限管理框架 1. Apache Shiro 2. Spring Security 3. Shiro 和 Spring Se ...

随机推荐

  1. js script中引用其他script

    在需要引用目标js中引用其他js依赖项 可以使用这个方法直接在js顶部加入这一行即可 document.write("<script type='text/javascript' sr ...

  2. 40多个纯CSS绘制的图形

    本文由码农网 – 陈少华原创,转载请看清文末的转载要求. 今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和 ...

  3. Security.website-that-focus-on-mobile-app-security

    Mobile App Security 1. DATA THEOREM LAB https://datatheorem.github.io/ Data Theorem's technical blog ...

  4. [Note] changing building platform from vs 2013 to vs community 2015

    The error turned out as "undefined linkage"(The same as you haven't use some function that ...

  5. listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.

    1.错误提示:Cannot have multiple items selected when the SelectionMode is Single. 刚刚在处理两个Listbox时,将其中一个li ...

  6. CSS3制作各种形状图像

    圆形-椭圆形-三角形-倒三角形=左三角形-右三角形-菱形-平行四边形- 星形-六角星形-五边形-六边形-八角形-心形-蛋形-无穷符号-消息提示框 不废话直接 html界面(亲测的) ------转自百 ...

  7. 无域环境下,VCENTER5.5 更改IP后 无法登陆异常修复

    转自http://bbs.vmsky.com/forum.php?mod=viewthread&tid=45593&highlight=vcenter%2Bip 由于没有域环境,SSO ...

  8. Linux下使用Eclipse开发Hadoop应用程序

    在前面一篇文章中介绍了如果在完全分布式的环境下搭建Hadoop0.20.2,现在就再利用这个环境完成开发. 首先用hadoop这个用户登录linux系统(hadoop用户在前面一篇文章中创建的),然后 ...

  9. STL库的内存配置器(allocator)

    正在学习中,如果有错,还请多多指教,根据不断的理解,会进行更改,更改之前的样子都会保留下来,记录错误是最大的进步,嗯嗯! 具有次配置力的SGI空间配置器(SGI是STL的一种版本,也有其他的版本) 这 ...

  10. 没有QQ的日子

    说来,也怪电脑不好,一开QQ就卡,年级也不小了,QQ上真的没啥话好说的,所以就想着关闭QQ. 其实做软件的知道,很多事情不是订下规则就可以做的到的,不过我还是给自己定个规则: 过完农历年后就不用QQ了 ...