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

  • 相关阅读:
    对于大规模机器学习的理解和认识
    Failed to initialize NVML: GPU access blocked by the operating system
    ubuntu 当中添加开机启动服务
    洛谷P2882 [USACO07MAR]面对正确的方式Face The Right Way(贪心)
    注意注意!
    洛谷P5092 [USACO2004OPEN]Cube Stacking 方块游戏 (带权并查集)
    loj10017. 「一本通 1.2 练习 4」传送带(三分套三分)
    POJ1475 Pushing Boxes(BFS套BFS)
    CF451E Devu and Flowers(组合数)
    POJ2311 Cutting Game(博弈论)
  • 原文地址:https://www.cnblogs.com/1zhk/p/5351968.html
Copyright © 2020-2023  润新知