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

 

评论列表

  

#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android虚拟电话号码,为何安卓手机坚持虚拟按键?这才是原因

关于屏内虚拟按键设计的好坏&#xff0c;一直都存在很大的争议。围绕着屏内虚拟按键&#xff0c;支持者与反对者之间进行了长期的争论&#xff0c;至今仍未分出胜负。然而&#xff0c;当多功能前置指纹按键开始普及的时候&#xff0c;屏内虚拟按键似乎正在逐步走向边缘化。不过…

【转】ABP源码分析二十二:Navigation

MenuDefinition&#xff1a;封装了导航栏上的主菜单的属性。 MenuItemDefinition&#xff1a;封装了主菜单的子菜单的属性。子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMenuItem&#xff1a;封装了用于显示给用户的菜单/以及子菜单集合。 ABP通过MenuDefinition/Me…

【转】ABP源码分析二十三:Authorization

Permission&#xff1a;用于定义一个Permission&#xff0c;一个permission可以包含多个子Permission. PermissionDictionary&#xff1a;继承自Dictionary<string, Permission>类&#xff0c;很明显是一个用于存储permission对象的字典。 IPermissionDefinitionContext…

VI/VIM键盘图

转载于:https://www.cnblogs.com/sdjc/archive/2006/09/14/1949532.html

android确认密码代码,Android手机卫士之确认密码对话框

本文接着实现“确认密码”功能&#xff0c;也即是用户以前设置过密码&#xff0c;现在只需要输入确认密码布局文件和《Android 手机卫士--设置密码对话框》中的布局基本类似&#xff0c;所有copy一下&#xff0c;修改一点细节就搞定&#xff1a;android:layout_width"matc…

修改MD5加密 提高网站安全

发表文章 修改MD5加密 提高网站安全2006-08-28 16:23:55大 中 小特别说明&#xff1a;此种改变只能用于在刚开始建站时才可&#xff0c;如果你中途改变的话就会出现问题。   也许提到MD5时大家都很熟&#xff0c;但你真的是这样吗&#xff1f;了解其是如何进行散列的实际过…

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

NotificationDefinition: 用于封装Notification Definnition 的信息。注意和Notification 的区别&#xff0c;如果把Notification看成是具体的消息内容&#xff0c;NotificationDefinition则是对这个消息自身的定义&#xff08;可理解为消息的类型&#xff09;。 INotification…

【转】ABP源码分析二十五:EventBus

IEventData/EventData: 封装了EventData信息&#xff0c;触发event的源对象和时间 IEventBus/EventBus: 定义和实现了了一系列注册&#xff0c;注销和触发事件处理函数的方法。EventBus定义了一个Dictionary容器来存放事件和处理该事件的对象(其实不是对象而是Factory&#xf…

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET调用Web Services方法...

在之前的例子里&#xff0c;由于Atlas客户端在调用Web Services方法时总是使用了Sys.Net.ServiceMethod类&#xff0c;因此始终使用了HTTP POST方法与服务器端进行交互。POST方法有其好处&#xff0c;不过GET方法也自有其价值。我们在使用Atlas进行Web Services调用时&#xff…

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

本文是ABP核心项目源码分析的最后一篇&#xff0c;介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系。当然可以自定义的去实现IAbpSession使之与CLR的Session关联 IAbpSession&#xff1a;定义如下图中的四个属性。 NullAbpSessio…

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

IRepository&#xff1a;接口定义了Repository常见的方法 AbpRepositoryBase&#xff1a;实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepositoryBase中定义的抽象方法&#xff1a;GetAll&#xff0c;Insert&#xff0c;Delete&#xff0c;Update。在实际项目…

泛型实现List(ListT)排序

代码 publicclassPost : IComparable<Post>{ privatestringid string.Empty; privatestringtitle string.Empty; privateintorderby; publicstringID { get{ returnid; } set{ id value; } } pu…

华为鸿蒙与佳华,华为鸿蒙系统发布,带来三大好消息

华为在6月2日举办鸿蒙产品发布会&#xff0c;正式推出搭载鸿蒙操作系统的智能手机。这意味着此前只用于智慧屏、可穿戴设备等产品的鸿蒙操作系统终于覆盖到华为最主要的终端。从目前市场上的操作系统市场比例上看&#xff0c;安卓占据了全球68.63%&#xff0c;苹果占据了30.99%…

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

这个模块简单&#xff0c;且无实际作用&#xff08;该模块用于支持ABP框架单元测试的&#xff09;。一般实际项目中都有用数据库做持久化&#xff0c;用了数据库就无法用这个MemoryDB 模块了。原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍)&#xff0c;一般用了数…

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

这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类&#xff0c;封装了对MongoDb数据库的操作。 这个module通过引用MongoDB.Driver&#xff0c;MongoDB.Bson&#xff0c;MongoDB.Driver.Core,MongoDB.Driver.Legacy类库来操作MongoDb. 当项目不需要依赖于关系型…

html防替换资源,Webpack中有没有替换html静态资源的插件

比如html文件中有如下代码<div><!-- /dev 是开发目录 --><img src"/dev/img.png"></div>然后经过处理后变成如下<div><!-- /static 是上线目录, a7l3k2n是图片的hash --><!-- 同时把img.png从/dev目录移动到/static目录 --&g…

【转】ABP源码分析三十:ABP.RedisCache

ABP 通过StackExchange.Redis类库来操作Redis数据库。 AbpRedisCacheModule&#xff1a;完成ABP.RedisCache模块的初始化(完成常规的依赖注入) AbpRedisCacheConfig&#xff1a;定义了connectionStringKey和databaseIdAppSetting的值。这两个值对象redis 在web.config中的key值…

平板可以看html文档吗,iPad如何看电脑里的视频 如何使用Ipad看电脑里的电影

电脑上的视频怎么在iPad上观看&#xff1f;如何在ipad播放电脑中的视频首先&#xff0c;看你的视频格式。如果是mp4&#xff0c;就可以直接放入ipad自带浏览器或者通过itunes直接传。其他格式的需要下载第三方播放器&#xff0c;目前使用较多的支持高清播放的有Oplayer&#xf…

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

这个模块封装了Automapper,使其更易于使用。 下图描述了改模块涉及的所有类之间的关系。 AutoMapAttribute&#xff0c;AutoMapFromAttribute和AutoMapToAttribute&#xff1a;这三个attribute用于标注一个类到另外一个类的map方向。 AutoMapperHelper: 通过调用Automapper的A…

SQL语言的事务机制_转摘

什么是数据库事务  数据库事务是指作为单个逻辑工作单元执行的一系列操作。设想网上购物的一次交易&#xff0c;其付款过程至少包括以下几步数据库操作&#xff1a;   更新客户所购商品的库存信息    保存客户付款信息--可能包括与银行系统的交互    生成订单并且保…