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源码分析系列文章目录

ABP源码分析二十一:Feature的更多相关文章

  1. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  2. ABP源码分析二十:ApplicationService

    IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...

  3. ABP源码分析二十四:Notification

    NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...

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

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

  5. ABP源码分析二十三:Authorization

    Permission:用于定义一个Permission,一个permission可以包含多个子Permission. PermissionDictionary:继承自Dictionary<str ...

  6. ABP源码分析二十五:EventBus

    IEventData/EventData: 封装了EventData信息,触发event的源对象和时间 IEventBus/EventBus: 定义和实现了了一系列注册,注销和触发事件处理函数的方法. ...

  7. ABP源码分析二十六:核心框架中的一些其他功能

    本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...

  8. ABP源码分析二十七:ABP.Entity Framework

    IRepository:接口定义了Repository常见的方法 AbpRepositoryBase:实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepo ...

  9. ABP源码分析二十八:ABP.MemoryDB

    这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库 ...

随机推荐

  1. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  2. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  3. bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序

    也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...

  4. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  5. 关于.NET参数传递方式的思考

    年关将近,整个人已经没有了工作和写作的激情,估计这个时候很多人跟我差不多,该相亲的相亲,该聚会喝酒的聚会喝酒,总之就是没有了干活的心思(我有很多想法,但就是叫不动我的手脚,所以我只能看着别人在做我想做 ...

  6. C#关于分页显示

    ---<PS:本人菜鸟,大手子还请高台贵手> 以下是我今天在做分页时所遇到的一个分页显示问题,使用拼写SQL的方式写的,同类型可参考哦~ ------------------------- ...

  7. 说一说python的牛比与不爽

    本人写了10年php了.今年开始改写python了.不是说php有什么不好,php在自己的势力范围内还是很牛比的.只是我已经不能满足于php那两亩地了. 习惯了脚本,所以很自然就过度到python了. ...

  8. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  9. 在禅道中实现WORD等OFFICE文档转换为PDF进行在线浏览

    条件: 安装好禅道的服务器 能直接浏览PDF的浏览器(或通过 安装插件实现 ) 文档转换服务程序(建议部署在另一台服务器上)     实现 原理: 修改禅道的文件预览功能(OFFICE文档其使用的是下 ...

  10. PADS Layout 颜色设置

    一.板框.装配线.标注线配置: 二.个人爱好,我一般把Top pads设置成为浅绿色,Top Trace/vias/2D Line/Text/Cooper设置成为深绿色,Error设置成为黄色,而Bo ...