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: