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的类型只能有一个(前文以作介绍),一般用了数据库 ...
随机推荐
- Python的单元测试(一)
title: Python的单元测试(一) author: 青南 date: 2015-02-27 22:50:47 categories: Python tags: [Python,单元测试] -- ...
- Node-Webkit打包
1.node-webkit是什么? NW.js is an app runtime based on Chromium and node.js. You can write native apps i ...
- redis 学习笔记(2)
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...
- 深入node之Transform
Transform流特性 在开发中直接接触Transform流的情况不是很多,往往是使用相对成熟的模块或者封装的API来完成流的处理,最为特殊的莫过于through2模块和gulp流操作.那么,Tra ...
- C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(1)
一看这个标题,是不去取名有点绕呢?或者是,还有些问题?报告LZ...你的标题取得有问题,是个病句!↖(^ω^)↗!!!先不要急,其实我今天带给大家的就是CoreCLR中的coreclr.其中它是在名字 ...
- 将DataTable中的某列转换成数组或者List
string[] arrRate = dtRate.AsEnumerable().Select(d => d.Field<string>("arry")).ToA ...
- Java获取本机的IP与MAC地址
有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...
- css样式之border
border用法详解: 1.border-width 属性设置边框的宽度 可能的值:像素 2.border-style 属性设置边框的样式 可能的值:solid(直线),dashed(虚线),dott ...
- 电信计费业务:预后融合OCS到底应该实扣还是虚扣?
引入OCS的初衷之一是为了让计费系统能够参与到用户的通讯控制中来,也就是所谓的实时信控.用户在没有余额时,通讯就会被停止,不会造成"天价欠费 ",一方面保障用户的利益,一方面也保障 ...
- 【干货分享】流程DEMO-人员调动流程
流程名: 调动 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: 流程: 图片:3.png DEMO包下载: http://files.cnblogs.com ...