【转】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中的方法來實現(xiàn)IFeatureManager中定義的方法。這個FeatureManager起到了一個類似適配器的作用,把IFeatureDefinitionContext適配成IFeatureManager。FeatureManager的另一個作用是初始化FeatureDictionary(其Features屬性)。
?
FeatureProvider: 抽象基類,用于向IFeatureDefinitionContext對象(FeatureManager)中添加Feature. Abp框架只提供了抽象類,下面代碼是一個簡單的示例。實際項目中可以創(chuàng)建自定義FeatureProvider來從數(shù)據庫中讀取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需要在子模塊中實現(xiàn)。因為feature往往是存放在數(shù)據庫中的。所以Abp底層框架是不會包含對數(shù)據庫有依賴的邏輯.該接口已經完全實現(xiàn)在了 module-zero項目中。如果沒有實現(xiàn)該接口,那么默認會使用NullFeatureValueStore對所有的功能返回null(此時使用默認的功能值)。
?
FeatureInterceptorRegistrar:用于給標注了RequiresFeatureAttribute特性的對象注冊FeatureInterceptor攔截器。由AbpKernelModuel調用。
?
FeatureInterceptor:執(zhí)行攔截器的邏輯,主要是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叫用戶最大數(shù)量,但是不明白怎么將用戶最大數(shù)量限定在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)添加用戶的最大數(shù)不能超過我feature定的最大值
支持(0)?反對(0)
??
#6樓?[樓主]?2016-04-13 22:39?ZHK的博客
@?struggle_new
如果想通過添加類似RequiresFeature這樣的特性來實現(xiàn)是不可能的,至少ABP原生是不支持的。所以要實現(xiàn)你的功能,只能在方法體里面通過featurechecker獲取你feature定的最大值,然后和已經添加的用戶數(shù)量做比較。
支持(0)?反對(0)
??
#7樓?2016-04-16 08:00?struggle_new
@?ZHK的博客
嗯,我在使用的時候發(fā)現(xiàn)也是要獲取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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新东方月薪5万急聘主播 成立多家新公司直
- 下一篇: 华为路由器推出延长服务宝:仅9.9元可延