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

评论列表

#1楼 2016-04-12 10:02 struggle_new

FeatureProvider是用于设置feature功能,如果我要在一个类或者方法使用这个特性是否有如下两种方式
1、使用RequiresFeature进行检查这种只能对布尔功能
2、使用 FeatureChecker.GetValue在方法中进行判定这种更多的是对值功能
请问一下楼主是否可以这样理解

支持(0) 反对(0)

#2楼[楼主] 2016-04-12 20:52 ZHK的博客

@ struggle_new
FeatureChecker.IsEnabled对布尔值Feature检查. FeatureChecker.GetValue你的理解是对的。

支持(0) 反对(0)

#3楼2016-04-12 21:40 struggle_new

@ ZHK的博客
比如我有这么一个功能,某一个租户对用户只能添加100用户!
我基于feature能想到的是首先定一个用户启用功能为feature然后在为这个功能添加一个子feature叫用户最大数量,但是不明白怎么将用户最大数量限定在service或者mananger的方法上!

支持(0) 反对(0)

#4楼[楼主] 2016-04-13 19:46 ZHK的博客

@ struggle_new
Applicationservice封装了featurechecker,通过它的getvalue方法不是可以获取到租户的这个feature的最大值么。不知道这是不是你想问的。

支持(0) 反对(0)

#5楼2016-04-13 20:05 struggle_new

@ ZHK的博客
比如在applicationservice里有一个添加用户的方法,然后这个方法限定某一个租户或者版本(edition)添加用户的最大数不能超过我feature定的最大值

支持(0) 反对(0)

#6楼[楼主] 2016-04-13 22:39 ZHK的博客

@ struggle_new
如果想通过添加类似RequiresFeature这样的特性来实现是不可能的,至少ABP原生是不支持的。所以要实现你的功能,只能在方法体里面通过featurechecker获取你feature定的最大值,然后和已经添加的用户数量做比较。

支持(0) 反对(0)

#7楼2016-04-16 08:00 struggle_new

@ ZHK的博客
嗯,我在使用的时候发现也是要获取feature的value然后在自己的代码做比较,主要是我怕我理解错了,谢谢你的解答

支持(0) 反对(0)

#8楼2016-06-06 15:50 Chobites

feature 我完全没有看出它的用处是什么 汗。楼主可以简单介绍一下场景吗?

支持(0) 反对(0)

#9楼[楼主] 2016-06-06 21:18 ZHK的博客

@ Chobites
http://www.cnblogs.com/farb/p/ABPFeatures.html

【转】ABP源码分析二十一:Feature相关推荐

  1. 【转】ABP源码分析二十四:Notification

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

  2. 【转】ABP源码分析二十:ApplicationService

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

  3. 【转】ABP源码分析二:ABP中配置的注册和初始化

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

  4. 【转】ABP源码分析四十一:ZERO的Audit,Setting,Background Job

    AuditLog: 继承自Entity<long>的实体类.封装AuditLog的信息. AuditingStore: 实现了IAuditingStore接口,实现了将AuditLog的信 ...

  5. 【转】ABP源码分析三十一:ABP.AutoMapper

    这个模块封装了Automapper,使其更易于使用. 下图描述了改模块涉及的所有类之间的关系. AutoMapAttribute,AutoMapFromAttribute和AutoMapToAttri ...

  6. 【转】ABP源码分析二十九:ABP.MongoDb

    这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类,封装了对MongoDb数据库的操作. 这个module通过引用MongoDB.Driver, ...

  7. 【转】ABP源码分析二十八:ABP.MemoryDB

    这个模块简单,且无实际作用(该模块用于支持ABP框架单元测试的).一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能 ...

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

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

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

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

最新文章

  1. 省略号和可变参数模板
  2. JACK——PaintRobot Exercise9
  3. WebSocket——stomp连接错误[Whoops! Lost connection to XXX]解决方案
  4. python桌面开发吐血_Python3环境(Windows10)单独配置Spyder——记录我的吐血之路...
  5. Express — 使用步骤
  6. 解决java.net.ConnectException: Connection refused:connect报错
  7. nginx 电子书_13本免费的电子书,拿走,不谢
  8. Office 365系列之十二:ActiveDirectory同步
  9. 教你如何用机翻软件开拓自己的青青草原
  10. 拓端tecdat|R语言提取时间序列的周期性成分应用EMD,小波滤波器,Baxter过滤器等
  11. LINUX双击无法启动解决一例
  12. android expandablelistview横向,expandableListView 总结
  13. aso优化师是什么_做ASO优化师这么多年,没想到被它打败了!
  14. GAE(Generalized Advantage Estimation) PPO
  15. 音乐计算机在哪里买,[计算器自带音乐在哪里]语音计算器上的音乐有什
  16. 王老吉、加多宝双茶争霸:新零售布局将成未来胜负关键?
  17. AcWing 292 炮兵阵地
  18. 单线复用有线Mesh组网案例
  19. unity3D学习10 AR/MR技术
  20. 项目初期BUG记录-20220622

热门文章

  1. 【算法设计与分析】13 分治策略的设计思想
  2. 数据结构与算法实战-C++实现
  3. Hive中COUNT的高级用法(条件过滤等)
  4. nodejs对mongodb数据库的增删改查操作(转载)
  5. while中的break
  6. Loj #6307. 「雅礼国庆 2017 Day1」Clique
  7. android UI布局
  8. 基于MLlib的机器学习--协同过滤与推荐
  9. jQuery浏览器类型判断和分辨率判断
  10. ADO.NET Entity Framework 使用中的经验总结