ABP框架中存在一个Feature的特性,功能和设计思路非常类似于框架中的Authorization功能,都是来控制用户是否能够继续操作某项功能,不同点在于Authorization默认是应用在IApplicationService上控制用户或者其所属租户是否具有权限访问服务,而Feature应用更为广泛可以控制访问任意类型,但是控制方式更为单纯只有开关(Enable或者Disable),而且是无法控制具体用户的,只能是某些指定的全局范围内。注意Feature也是有父子关系的,只有父Feature可用,子Feature才有意义。

  如上所述所有的父Feature主要开和关两种值,所以为了简单起见,父Feature有"true"和"false"两个字符串为可能值,定义一个Feature特别简单,在任何地方定义一个继承自FeatureProvider的类型,并重写

void SetFeatures(IFeatureDefinitionContext context)

方法,在方法体中调用IFeatureDefinitionContext的Create方法创建一个Name具有唯一性的Feature。在任意一个自定义的AbpModule类中通过StartupConfiguration引用到FeatureConfiguration,FeatureConfiguration的Providers属性就是用来注册所有FeatureProvider的

internal class FeatureConfiguration : IFeatureConfiguration
{
public ITypeList<FeatureProvider> Providers { get; private set; } public FeatureConfiguration()
{
Providers = new TypeList<FeatureProvider>();
}
}

在系统启动阶段会使用Ioc容器实例化一个单例的FeatureManager,调用其void Initialize()方法将FeatureConfiguration中存储的所有FeatureProvider类型注册到FeatureManager实例所包含的的一个字典变量中,同时会递归的将Feature自身的子Feature包含到字典中。后面所有需要Check Feature的时候都可以通过FeatureManager的实例根据Feature的具有唯一性的Name获得指定的Feature从而判断是否启用。

  定义并注册一个Feature很简单,在项目中使用Feature也同样很简单,之前的博文中提到框架中有一个FeatureInterceptorRegistrar的静态类型,在最核心的AbpKernelModule中会调用其Initialize()方法使得可以监听Ioc容器注册新类所触发的事件,是的,所注册的处理逻辑会判断Ioc新注册的类型或者其任意的方法是否应用了RequiresFeatureAttribute,如果有就会添加一个FeatureInterceptor的拦截器,在Target逻辑被执行之前,FeatureInterceptor会获取Target上RequiresFeatureAttribute中所指定必须处于开启状态的Feature集合(可以要求必须全部处于开启或任意一个开启),只有Feature Check Ok了,才会执行真正的逻辑,否则只会报异常。

ABP框架详解(四)Feature的更多相关文章

  1. ABP框架详解(五)Navigation

    ABP框架中的Navigation功能用于管理业务系统中所有可用的菜单导航控件,通常在业务系统的首页会有一个全局性的导航菜单,JD商城,天猫,猪八戒网莫不如是.所以为方便起见,Navigation功能 ...

  2. ABP框架详解(八)动态ApiController的生成和访问机制

    在ABP框架中提供了一套动态生成ApiController的机制(依然支持原生ApiController的使用方式),虽然说是动态生成ApiController但是实际上并没有真正在启动程序的时候生成 ...

  3. ABP框架详解(七)Caching

    在ABP框架中存在一个缓存机制,使用ICache的继承类来存储最终需要缓存的数据,可以吧ICache看成一个字典对象,使用Key作为真实数据的具有唯一性的表示.使用上与字典对象完全相同,Get方法传递 ...

  4. ABP框架详解(三)Domain

    此处的Domain主要指Abp类库根目录下Domain文件夹.顾名思义该目录下是用来存放与领域实体,领域逻辑执行,存储,领域服务相关的内容. 1.Entities (1)为整个Abp框架后期开发的所有 ...

  5. ABP框架详解(二)AbpKernelModule

    AbpKernelModule类是Abp框架自己的Module,它也跟所有其他的Module一样继承自AbpModule,重写PreInitialize,Initialize,PostInitiali ...

  6. ABP框架详解(一)ABPBootstrapper

    在ABP框架的AbpBootstrapper主要用于框架的基本配置的注册和初始化,在Web应用启动阶段实例化一个AbpBootstrapper并调用Initialize方法初始化,该类主要包含两个公有 ...

  7. ABP框架详解(六)Aspects

    这种AOP式的设计非常类似于Asp.net MVC和WebApi中过滤器(Filter)机制,感觉没有太多可讲述的,只能谈谈设计思路. 框架中AspectAttribute特性用于设置到需要被拦截的T ...

  8. jQuery Validate验证框架详解

    转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...

  9. mina框架详解

     转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...

随机推荐

  1. 关于Servlet手动配置web.xml部分代码

    <servlet> <!-- 文件名 --> <servlet-name>deleteServlet</servlet-name> <!-- 文件 ...

  2. python 传参open

    # Author:mologa k = "ab" for i in k: with open('%s.txt'%i,'w') as f: f.write("hello&q ...

  3. [刘阳Java]_MyBatis_映射文件的select标签入门_第3讲

    1.Mybatis映射文件的<select>标签主要帮助我们完成SQL语句查询功能,<select>标签它包含了很多属性,下面简单对<select>标签的属性做一个 ...

  4. linux 怎么完全卸载mysql数据库

    在linux下开发,mysql数据库是经常用到的,对于初学者来说,在linux怎么安装卸载mysql数据库,也许可能比较痛苦,这里简单介绍下,怎么卸载msql数据库. a)查看系统中是否以rpm包安装 ...

  5. Ceph剖析:数据分布之CRUSH算法与一致性Hash

    作者:吴香伟 发表于 2014/09/05 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 数据分布是分布式存储系统的一个重要部分,数据分布算法至少要考虑以下三个 ...

  6. SVN常用问题汇总

    参考文档.http://www.cnblogs.com/newsea/archive/2012/04/28/2474818.html 1.客户端取消记住用户名和密码. 2.汉化后设置为中文

  7. listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.

    1.错误提示:Cannot have multiple items selected when the SelectionMode is Single. 刚刚在处理两个Listbox时,将其中一个li ...

  8. tomcat连接池配置详解

    <bean class="org.apache.tomcat.jdbc.pool.PoolProperties"> <property name="ur ...

  9. freeCodeCamp:Caesars Cipher

    让上帝的归上帝,凯撒的归凯撒. 下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码. 移位密码也就是密码中的字母会按照指定的数量来做移位. 一个常见的案例就是ROT13密码,字母 ...

  10. js中返回上一页失效的解决办法

    最近在做移动端的时候,碰到了一个问题,就是点击返回按键,使用history.go(-1)或history.back(-1)不能够生效.于是便寻找其他的方法,终于找到了一位大神的方法如下: if(win ...