基于之前建立的 Prism 模块化架构。1. 用户登录 权限系统1User 实体与服务// MaxWell.Domain/Entities/User.csnamespaceMaxWell.Domain.Entities;publicclassUser{publicstringUserId{get;set;}string.Empty;publicstringUserName{get;set;}string.Empty;publicstringDisplayName{get;set;}string.Empty;publicstringRole{get;set;}Operator;// Operator, Engineer, AdminpublicDateTimeLoginTime{get;set;}DateTime.UtcNow;publicListstringPermissions{get;set;}new();}2IUserService 接口// MaxWell.CommonBasis/Services/IUserService.csnamespaceMaxWell.CommonBasis.Services;publicinterfaceIUserService{UserCurrentUser{get;}boolIsLoggedIn{get;}eventEventHandlerUser?UserChanged;TaskLoginResultLoginAsync(stringusername,stringpassword);voidLogout();boolHasPermission(stringpermission);boolIsInRole(stringrole);}3UserService 实现// MaxWell.CommonBasis/Services/UserService.csusingMaxWell.Domain.Entities;namespaceMaxWell.CommonBasis.Services;publicclassUserService:IUserService{publicUserCurrentUser{get;privateset;}newUser{RoleGuest};publicboolIsLoggedInCurrentUser.Role!Guest;publiceventEventHandlerUser??UserChanged;privatereadonlyILog_loggerLogManager.GetLogger(UserService);publicasyncTaskLoginResultLoginAsync(stringusername,stringpassword){// 实际项目中应调用认证服务或数据库awaitTask.Delay(300);// 模拟网络延迟if(usernameadminpassword123456){CurrentUsernewUser{UserIdU001,UserNameusername,DisplayName管理员,RoleAdmin,Permissions{Experiment.Start,Vision.Control,Alarm.Manage}};}elseif(usernameengineerpassword123456){CurrentUsernewUser{UserIdU002,UserNameusername,DisplayName工程师,RoleEngineer,Permissions{Experiment.Start,Vision.View}};}else{returnLoginResult.Fail(用户名或密码错误);}UserChanged?.Invoke(this,CurrentUser);_logger.Info($用户登录成功:{CurrentUser.DisplayName}({CurrentUser.Role}));returnLoginResult.Success(CurrentUser);}publicvoidLogout(){CurrentUsernewUser{RoleGuest};UserChanged?.Invoke(this,null);_logger.Info(用户已登出);}publicboolHasPermission(stringpermission){returnCurrentUser.Permissions.Contains(permission);}publicboolIsInRole(stringrole){returnCurrentUser.Role.Equals(role,StringComparison.OrdinalIgnoreCase);}}2. 模块热更新界面Module Management ViewModuleManagementView.xaml!-- Views/ModuleManagementView.xaml --UserControlx:ClassMaxWell.Views.ModuleManagementViewxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlGridMargin20Grid.RowDefinitionsRowDefinitionHeightAuto/RowDefinitionHeight*//Grid.RowDefinitionsStackPanelOrientationHorizontalMargin0,0,0,15ButtonContent刷新模块列表Command{Binding RefreshCommand}Margin5/ButtonContent加载选中模块Command{Binding LoadSelectedCommand}Margin5/ButtonContent卸载选中模块Command{Binding UnloadSelectedCommand}Margin5//StackPanelDataGridGrid.Row1ItemsSource{Binding Modules}SelectedItem{Binding SelectedModule}AutoGenerateColumnsFalseDataGrid.ColumnsDataGridTextColumnHeader模块名称Binding{Binding ModuleName}Width200/DataGridTextColumnHeader状态Binding{Binding Status}Width100/DataGridTextColumnHeader版本Binding{Binding Version}Width80/DataGridTextColumnHeader依赖Binding{Binding DependsOn}Width200//DataGrid.Columns/DataGrid/Grid/UserControlModuleManagementViewModel.cs// ViewModels/ModuleManagementViewModel.csusingPrism.Commands;usingPrism.Mvvm;usingMaxWell.CommonBasis.ModuleConfig;namespaceMaxWell.ViewModels;publicclassModuleManagementViewModel:ViewModelBase{privatereadonlyDynamicModuleLoader_moduleLoader;privatereadonlyModuleConfigurationManager_configManager;publicObservableCollectionModuleInfoViewModelModules{get;}new();publicModuleInfoViewModel?SelectedModule{get;set;}publicDelegateCommandRefreshCommand{get;}publicDelegateCommandLoadSelectedCommand{get;}publicDelegateCommandUnloadSelectedCommand{get;}publicModuleManagementViewModel(IEventAggregatoreventAggregator,DynamicModuleLoadermoduleLoader,ModuleConfigurationManagerconfigManager):base(eventAggregator){_moduleLoadermoduleLoader;_configManagerconfigManager;RefreshCommandnewDelegateCommand(LoadModuleList);LoadSelectedCommandnewDelegateCommand(LoadSelectedModule);UnloadSelectedCommandnewDelegateCommand(UnloadSelectedModule);LoadModuleList();}privatevoidLoadModuleList(){Modules.Clear();varconfigs_configManager.GetAllModuleConfigs();foreach(varconfiginconfigs){Modules.Add(newModuleInfoViewModel(config));}}privatevoidLoadSelectedModule(){if(SelectedModulenull)return;_moduleLoader.LoadModule(SelectedModule.AssemblyPath,SelectedModule.ModuleTypeFullName);LoadModuleList();// 刷新列表}privatevoidUnloadSelectedModule(){if(SelectedModulenull)return;_moduleLoader.UnloadModule(SelectedModule.ModuleName);LoadModuleList();}}publicclassModuleInfoViewModel:BindableBase{publicstringModuleName{get;}publicstringAssemblyPath{get;}publicstringModuleTypeFullName{get;}publicstringStatus{get;set;}未加载;publicstringVersion{get;set;}1.0;publicstringDependsOn{get;set;};publicModuleInfoViewModel(ModuleConfigconfig){ModuleNameconfig.ModuleName;AssemblyPathconfig.AssemblyName;ModuleTypeFullNameconfig.ModuleTypeFullName;}}3. 在 App.xaml.cs 中集成protectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){// ... 其他注册containerRegistry.RegisterSingletonModuleConfigurationManager();containerRegistry.RegisterSingletonDynamicModuleLoader();containerRegistry.RegisterSingletonIModulePermissionService,ModulePermissionService();containerRegistry.RegisterSingletonIUserService,UserService();// 注册模块管理界面containerRegistry.RegisterForNavigationModuleManagementView,ModuleManagementViewModel(ModuleManagementView);}使用方式登录后可进入“模块管理”页面支持运行时动态加载/卸载模块权限系统可控制哪些用户能操作模块