ABP源码分析二十二:Navigation
MenuDefinition:封装了导航栏上的主菜单的属性。
MenuItemDefinition:封装了主菜单的子菜单的属性。子菜单可以引用其他子菜单构成一个菜单树
UserMenu/UserMenuItem:封装了用于显示给用户的菜单/以及子菜单集合。 ABP通过MenuDefinition/MenuItemDefinition构成了完整的系统菜单集合(超集)。而UserMenu/UserMenuItem只构成用户所能访问的菜单集合,并且其DisplayName是本地化以后的DisplayName。

INavigationManager:这个接口封装了一个字典类型的Menus和MenuDefinition类型的MainMenu。

NavigationManager:实现了INavigationManager,运行时是一个单例对象。完成菜单集的初始化。navigationManager在Initialize方法中先从configuration中获取NavigationProvider派生类的type,然后通过容器生成该类型的实例,并调用NavigationProvider实例的SetNavigation完成菜单项的初始化。navigationManager的Initialize方法是在AbpKernelModule的PostInitialize方法中被调用的。
INavigationProviderContext/NavigationProviderContext:上下文类,被用做方法的参数。这边只封装了INavigationManager对象

NavigationProvider: 功能类似于FeatureProvider。抽象基类,用于设置NavigationManager的Menus和MainMenu(通过 INavigationProviderContext对象访问NavigationManager)。 Abp框架只提供了抽象类,下面代码是一个简单的示例。实际项目中可以创建自定义NavigationProvider来从数据库中读取Menu信息来填充到NavigationManager对象中。
下面以SimpleTask项目为例: 该项目自定义了NavigationProvider的派生类,并且在module的preinitialize方法中将其注册到abp底层框架的configuration 中。

INavigationConfiguration/NavigationConfiguration: NavigationManager通过具体的NavigationProvider来初始化Menus和MainMenu。但是ABP核心模块处于最底层,怎么能知道上层定义的NavigationProvider的类型呢? NavigationConfiguration为解决这个问题引入了NavigationProvider配置项。NavigationProvider就是一个Type 列表 (ITypeList<NavigationProvider>),注意是NavigationProvider的Type,不是实例。在需要NavigationProvider的地方,可以使用容器根据Type构造出实例。

下面代码演示了怎么往ABP中添加具体的NavigationProvider。

IUserNavigationManager/UserNavigationManager: 通过INavigationManager的menus和用户信息,生成该用户可访问的菜单集合。主要检查两点:一是通过PermissionChecker检查一个用户是否拥有对某个菜单项的访问权限,另一项则是通过featurechecker检查一个用户所在的tenant是否有对该菜单项的访问权限。


ABP源码分析二十二:Navigation的更多相关文章
- ABP源码分析三十二:ABP.SignalR
Realtime Realtime是ABP底层模块提供的功能,用于管理在线用户.它是使用SignalR实现给在线用户发送通知的功能的前提 IOnlineClient/OnlineClient: 封装在 ...
- ABP源码分析四十二:ZERO的身份认证
ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展.同时重写了ABP核心模块中的permission功能,以实现 ...
- spark 源码分析之十二 -- Spark内置RPC机制剖析之八Spark RPC总结
在spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv中,剖析了NettyRpcEnv的创建过程. Dispatcher.NettyStreamManager.T ...
- ABP源码分析三十四:ABP.Web.Mvc
ABP.Web.Mvc模块主要完成两个任务: 第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用. 第二,一些常见的基础 ...
- ABP源码分析三十:ABP.RedisCache
ABP 通过StackExchange.Redis类库来操作Redis数据库. AbpRedisCacheModule:完成ABP.RedisCache模块的初始化(完成常规的依赖注入) AbpRed ...
- ABP源码分析三十五:ABP中动态WebAPI原理解析
动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...
- ABP源码分析三十六:ABP.Web.Api
这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...
- ABP源码分析三十九:ABP.Hangfire
ABP对HangFire的集成主要是通过实现IBackgroundJobManager接口的HangfireBackgroundJobManager类完成的. HangfireBackgroundJo ...
- ABP源码分析四十:ZERO的Application和Tenant
ABP的Zero模块以数据库为数据源实现了ABP框架中的tenant management (multi-tenancy), role management, user management, ses ...
- ABP源码分析四十四:ZERO的配置
ABP Zero模块中需要配置的地方主要集中在三块:配置静态的role,配置外部认证源,以及配置本地化语言和资源. UserManagementConfig/IUserManagementConfig ...
随机推荐
- 【AR实验室】ARToolKit之Example篇
0x00 - 前言 PS : 我突然意识到ARToolKit本质可能就是一个可以实时求解相机内外参的解决方案. 拿到一个新的SDK,90%的人应该都会先跑一下Example.拿到ARToolKit的S ...
- Centos6.5下编译安装mysql 5.6
一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...
- 03.LoT.UI 前后台通用框架分解系列之——多样的表格
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- RabbitMq应用一
RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...
- C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能
随着微信开逐步开放更多JSSDK的接口,我们可以利用自定义网页的方式来调用更多微信的接口,实现我们更加丰富的界面功能和效果,例如我们可以在页面中调用各种手机的硬件来获取信息,如摄像头拍照,GPS信息. ...
- StatePattern(状态模式)
/** * 状态模式 * @author TMAC-J * 状态模式和策略模式很像,其实仔细研究发现完全不一样 * 策略模式各策略之间没有任何关系,独立的 * 状态模式各状态之间接口方法都是一样的 * ...
- 【干货分享】流程DEMO-外出申请
流程名: 外出申请 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: 流程: 图片:2.png DEMO包下载: http://files.cnblog ...
- 新技术≠颠覆:CIO 要有战略耐心
新技术≠颠覆:CIO 要有战略耐心 大数据,云时代,互联网思维, 物联网--最近一两年,这些字眼一次次地出现在各种大大小小的CIO会议上和他们的私下交流圈子里,作为对新技术最敏感的人群,一方面他们迫切 ...
- JAVA设计模式之模板模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- php安装threads多线程扩展
php5.3或以上,且为线程安全版本.apache和php使用的编译器必须一致.通过phpinfo()查看Thread Safety为enabled则为线程安全版.通过phpinfo()查看Compi ...