1. 程式人生 > >ABP原始碼分析二十二:Navigation

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原始碼分析ZERO的身份認證

ABP Zero模組通過自定義實現Asp.Net Identity完成身份認證功能, 對Asp.Net Identity做了較大幅度的擴充套件。同時重寫了ABP核心模組中的permission功能,以實現授權。注意:ABP僅僅使用了Asp.Net Identity的身份認證功能,但沒有使用Asp.Net Id

ABP原始碼分析ABP.SignalR

Realtime Realtime是ABP底層模組提供的功能,用於管理線上使用者。它是使用SignalR實現給線上使用者傳送通知的功能的前提 IOnlineClient/OnlineClient: 封裝線上使用者的資訊 OnlineClientManager/IOnlineClientManager:

ABP原始碼分析ABP.AutoMapper

這個模組封裝了Automapper,使其更易於使用。 下圖描述了改模組涉及的所有類之間的關係。 AutoMapAttribute,AutoMapFromAttribute和AutoMapToAttribute:這三個attribute用於標註一個類到另外一個類的map方向。 Auto

ABP原始碼分析ZERO的Audit,Setting,Background Job

AuditLog: 繼承自Entity<long>的實體類。封裝AuditLog的資訊。 AuditingStore: 實現了IAuditingStore介面,實現了將AuditLog的資訊儲存到資料庫的功能。其通過IRepository<AuditLog, long>例項完成對資料

ABP原始碼分析ABP.Web.Mvc

ABP.Web.Mvc模組主要完成兩個任務: 第一,通過自定義的AbpController抽象基類封裝ABP核心模組中的功能,以便利的方式提供給我們建立controller使用。 第二,一些常見的基礎功能的實現。 AbpController:這是一個抽象基類,繼承自MVC Controller,是A

ABP原始碼分析ABP.Web.Api

這裡的內容和ABP 動態webapi沒有關係。除了動態webapi,ABP必然是支援使用傳統的webApi。ABP.Web.Api模組中實現了一些同意的基礎功能,以方便我們建立和使用asp.net webApi。 AbpApiController:這是一個抽象基類,繼承自ApiController,是AB

ABP原始碼分析ABP中動態WebAPI原理解析

動態WebAPI應該算是ABP中最Magic的功能之一了吧。開發人員無須定義繼承自ApiController的類,只須重用Application Service中的類就可以對外提供WebAPI的功能,這應該算是對DRY的最佳詮釋了. 如下圖所示,一行程式碼就為所有實現了IApplicationService的

ABP原始碼分析ZERO的配置

ABP Zero模組中需要配置的地方主要集中在三塊:配置靜態的role,配置外部認證源,以及配置本地化語言和資源。 UserManagementConfig/IUserManagementConfig:定義了一個配置項,用於配置外部認證源。預設情況下,ABP Zero使用AbpUser表作為身份

ABP原始碼分析ABP.Hangfire

ABP對HangFire的整合主要是通過實現IBackgroundJobManager介面的HangfireBackgroundJobManager類完成的。 HangfireBackgroundJobManager:實現了介面IBackgroundJobManager中的方法EnqueueAsync,通過

ABP原始碼分析ABP.Web.Api Script Proxy API

ABP提供Script Proxy WebApi為所有的Dynamic WebApi生成訪問這些WebApi的JQuery代理,AngularJs代理以及TypeScriptor代理。這些個代理就是javascript指令碼,通過這些代理可以簡單的訪問Dynamic webApi。 如下例項演示一個最基本的

ABP原始碼分析ABP中的異常處理

ABP 中異常處理的思路是很清晰的。一共五種型別的異常類。 AbpInitializationException用於封裝ABP初始化過程中出現的異常,只要丟擲AbpInitializationException異常就可以,無須做額外處理。這類異常往往是需要維護人員介入分析的。 其他四個異常都在AbpCon

ABP原始碼分析ZERO的Application和Tenant

ABP的Zero模組以資料庫為資料來源實現了ABP框架中的tenant management (multi-tenancy), role management, user management, session, authorization (permission management), setting m

Java-Collection原始碼分析)——Set、AbstractSet、HashSet和LinkedHashSet

該類提供了Set介面的骨架實現,以最大限度地減少實現此介面所需的工作量。 通過擴充套件此類來實現集合的過程與通過擴充套件AbstractCollection實現集合的過程相同,除了此類的子類中的所有方法和建構函式都必須遵守由Set介面施加的附加約束(例如,新增方法不能允許將一個物件的多個例項新增到集合中)。

Netty原始碼分析)----- 心跳服務之 IdleStateHandler 原始碼分析

什麼是心跳機制? 心跳說的是在客戶端和服務端在互相建立ESTABLISH狀態的時候,如何通過傳送一個最簡單的包來保持連線的存活,還有監控另一邊服務的可用性等。 心跳包的作用 保活Q:為什麼說心跳機制能保持連線的存活,它是叢集中或長連線中最為有效避免網路中斷的一個重要的保障措施?A:之所以說是&l

ABP原始碼分析八: ABP.Web.Api.OData

如果對OData不熟悉的話可參考OData的初步認識一文以獲取OData的一些初步知識。 API.Odata 模組唯一用處就是提供了一個泛型版本的ODataController,實現了Controller程式碼的常用。 AbpODataEntityController<TEntity, TPrima

ABP原始碼分析Navigation

MenuDefinition:封裝了導航欄上的主選單的屬性。 MenuItemDefinition:封裝了主選單的子選單的屬性。子選單可以引用其他子選單構成一個選單樹 UserMenu/UserMenuItem:封裝了用於顯示給使用者的選單/以及子選單集合。 ABP通過MenuDefinition/M

ABP原始碼分析核心框架中的一些其他功能

本文是ABP核心專案原始碼分析的最後一篇,介紹一些前面遺漏的功能 AbpSession AbpSession: 目前這個和CLR的Session沒有什麼直接的聯絡。當然可以自定義的去實現IAbpSession使之與CLR的Session關聯 IAbpSession:定義如下圖中的四個屬性。 NullA

ABP原始碼分析ApplicationService

IApplicationService : 空介面,起標識作用。所有實現了IApplicationService 的類都會被自動注入到容器中。同時所有IApplicationService物件都會被注入一些攔截器(例如:auditing, UnitOfWork等)以實現AOP AbpServiceBase:

ABP原始碼分析ABP.MongoDb

這個Module通過建立一個MongoDbRepositoryBase<TEntity> 基類,封裝了對MongoDb資料庫的操作。 這個module通過引用MongoDB.Driver,MongoDB.Bson,MongoDB.Driver.Core,MongoDB.Driver.Legacy類

ABP原始碼分析ABP.Entity Framework

IRepository:介面定義了Repository常見的方法 AbpRepositoryBase:實現了IRepository介面的常見方法 EfRepositoryBase:實現了AbpRepositoryBase中定義的抽象方法:GetAll,Insert,Delete,Update。在實