ABP源码分析二十一:Feature
Feature是什么?Feature就是对function的分类方法,其与function的关系就比如Role和User的关系一样。
ABP中Feature具有以下属性: 其中最重要的属性是name,用以表示feature的Identity,一个feature一个name. 一个Feature可以有一组子Features,从而构成Feature树。

FeatureDictionary: 其本身继承自Dictionary。其作用就是把一个Feature及其Child Features从树状结构加载加到Dictionary结构中(扁平化)。
IFeatureDefinitionContext/FeatureDefinitionContextBase : 这组接口和抽象类提供管理FeatureDictionary的方法, 新建一个feature到FeatureDictionary中,和根据 name从 FeatureDictionary返回一个feature. 他们是Feature Manager的基类
IFeatureManager:该接口定义根据name返回Feature的一些方法

FeatureManager:通过调用继承自FeatureDefinitionContextBase中的方法来实现IFeatureManager中定义的方法。这个FeatureManager起到了一个类似适配器的作用,把IFeatureDefinitionContext适配成IFeatureManager。FeatureManager的另一个作用是初始化FeatureDictionary(其Features属性)。

FeatureProvider: 抽象基类,用于向IFeatureDefinitionContext对象(FeatureManager)中添加Feature. Abp框架只提供了抽象类,下面代码是一个简单的示例。实际项目中可以创建自定义FeatureProvider来从数据库中读取feature来填充到FeatureManager对象中。

IFeatureConfiguration/FeatureConfiguration: FeatureManager通过具体的FeatureProvider来初始化FeatureDictionary(其Features属性)。但是ABP核心模块处于项目的最底层,怎么能知道上层定义的FeatureProvider的类型呢? FeatureConfiguration 为解决这个问题引入了FeatureProvider配置项。FeatureProvider就是一个Type 列表 (ITypeList<FeatureProvider>),注意是FeatureProvider的Type,不是实例。在需要FeatureProvider的地方,可以使用容器根据Type构造出实例。


IFeatureChecker/FeatureChecker: 提供检查特定的feture对于特定的tenant是否可用。首先FeatureChecker 根据Feature Name通过FeatureManager获取Featue,然后通过从IFeatureValueStore对象根据Feature Name和tenantId获取Feature的value值。 然后判断value是否为“true”.

IFeatureValueStore: 接口定义了获取Feature值的方法。FeatureValueStore需要在子模块中实现。因为feature往往是存放在数据库中的。所以Abp底层框架是不会包含对数据库有依赖的逻辑.该接口已经完全实现在了 module-zero项目中。如果没有实现该接口,那么默认会使用NullFeatureValueStore对所有的功能返回null(此时使用默认的功能值)。
FeatureInterceptorRegistrar:用于给标注了RequiresFeatureAttribute特性的对象注册FeatureInterceptor拦截器。由AbpKernelModuel调用。
FeatureInterceptor:执行拦截器的逻辑,主要是IFeatureChecker完成feature的检查。一个标准的Castle 拦截器。

IFeatureDependency/SimpleFeatureDependency:如果某项功能要先进行feature检查,可以加上一个IFeatureDependency属性。IFeatureDependency对象通过调用IFeatureChecker对象完成真正的检查。具体用例,可查看MenuItemDefinition和UserNavigationManager的用法。
IFeatureDependencyContext/FeatureDependencyContext: 这个上下文类封装了IFeatureChecker 和 IResolver对象。被用于方法的形参。

MenuItemDefinition:

UserNavigationManager:

ABP源码分析二十一:Feature的更多相关文章
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- ABP源码分析二十:ApplicationService
IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...
- ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...
- ABP源码分析二十二:Navigation
MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...
- ABP源码分析二十三:Authorization
Permission:用于定义一个Permission,一个permission可以包含多个子Permission. PermissionDictionary:继承自Dictionary<str ...
- ABP源码分析二十五:EventBus
IEventData/EventData: 封装了EventData信息,触发event的源对象和时间 IEventBus/EventBus: 定义和实现了了一系列注册,注销和触发事件处理函数的方法. ...
- ABP源码分析二十六:核心框架中的一些其他功能
本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...
- ABP源码分析二十七:ABP.Entity Framework
IRepository:接口定义了Repository常见的方法 AbpRepositoryBase:实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepo ...
- ABP源码分析二十八:ABP.MemoryDB
这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库 ...
随机推荐
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 快速搭建springmvc+spring data jpa工程
一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...
- 记录一则Linux SSH的互信配置过程
需求:四台Linux主机,IP地址为192.168.10.10/11/12/13,配置登录用户的互信 1.各节点ssh-keygen生成RSA密钥和公钥 ssh-keygen -q -t rsa -N ...
- pdo的使用
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口. PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据. PDO随 ...
- 设计模式之结构类模式大PK
结构类模式大PK 结构类模式包括适配器模式.桥梁模式.组合模式.装饰模式.门面模式.享元模式和代理模式.之所以称其为结构类模式,是因 ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
- 那些年【深入.NET平台和C#编程】
一.深入.NET框架 1..NET框架具有两个组件:CLR(公共语言运行时)和FCL(框架类库),CLR是.NET框架的基础 2.框架核心类库: System.Collections.Generic: ...
- c# 字符串连接使用“+”和string.format格式化两种方式
参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...
- C# 泛型
C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...