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是否有對該菜單項的訪問權限。