以下是针对 MaxWell 工业上位机项目的四个完整实现全部基于 Prism Autofac MediatR 的模块化架构。1. AlarmModule 完整示例AlarmModule.cs// MaxWell.Modules.AlarmModule/AlarmModule.csusingPrism.Ioc;usingPrism.Modularity;usingPrism.Regions;usingMaxWell.Modules.AlarmModule.Views;usingMaxWell.Modules.AlarmModule.ViewModels;namespaceMaxWell.Modules.AlarmModule;publicclassAlarmModule:IModule{privatereadonlyIRegionManager_regionManager;publicAlarmModule(IRegionManagerregionManager){_regionManagerregionManager;}publicvoidRegisterTypes(IContainerRegistrycontainerRegistry){// 注册导航视图containerRegistry.RegisterForNavigationAlarmCenterView,AlarmCenterViewModel(AlarmCenterView);containerRegistry.RegisterForNavigationAlarmHistoryView,AlarmHistoryViewModel(AlarmHistoryView);// 模块内服务containerRegistry.RegisterSingletonIAlarmService,AlarmService();}publicvoidOnInitialized(IContainerProvidercontainerProvider){// 模块启动时自动注册到侧边栏或主区域_regionManager.RegisterViewWithRegion(SidebarRegion,typeof(AlarmMenuItemView));}}AlarmCenterViewModel.cs// MaxWell.Modules.AlarmModule/ViewModels/AlarmCenterViewModel.csusingPrism.Mvvm;usingPrism.Events;usingMaxWell.Application.Notifications;namespaceMaxWell.Modules.AlarmModule.ViewModels;publicclassAlarmCenterViewModel:ViewModelBase{privatereadonlyIAlarmService_alarmService;publicAlarmCenterViewModel(IEventAggregatoreventAggregator,IAlarmServicealarmService):base(eventAggregator){_alarmServicealarmService;// 订阅全局报警通知SubscribeAlarmTriggeredNotification,AlarmTriggeredNotification(OnAlarmTriggered);}privatevoidOnAlarmTriggered(AlarmTriggeredNotificationnotification){// 更新报警列表Alarms.Add(newAlarmItemViewModel{Levelnotification.Level,Messagenotification.Message,StationIdnotification.StationId,Timestampnotification.Timestamp});}publicObservableCollectionAlarmItemViewModelAlarms{get;}new();}2. 模块间通信EventAggregator MediatR 结合推荐通信方式MediatR Notification后端业务事件解耦Prism EventAggregator前端 UI 更新示例AlarmTriggeredNotification// MaxWell.Application/Notifications/AlarmTriggeredNotification.cspublicrecordAlarmTriggeredNotification:INotification{publicintLevel{get;init;}// 1Info, 2Warning, 3CriticalpublicstringMessage{get;init;}string.Empty;publicstringStationId{get;init;}string.Empty;publicstringSourceModule{get;init;}string.Empty;publicDateTimeTimestamp{get;init;}DateTime.UtcNow;}跨模块通信示例ExperimentModule → AlarmModule// ExperimentModule 中的 ExperimentViewModelprivatereadonlyIMediator_mediator;publicasyncTaskStartExperiment(){varresultawait_mediator.Send(...);if(!result.IsSuccess){// 发布 MediatR 通知 → AlarmModule 接收await_mediator.Publish(newAlarmTriggeredNotification{Level3,Message实验启动失败,StationIdST001,SourceModuleExperimentModule});}}AlarmModule 接收处理// AlarmCenterViewModel.csSubscribeAlarmTriggeredNotification,AlarmTriggeredNotification(HandleAlarm);3. 动态加载模块 配置文件示例appsettings.Modules.json{Modules:[{ModuleName:ExperimentModule,AssemblyName:MaxWell.Modules.ExperimentModule,Enabled:true,DependsOn:[InfrastructureModule]},{ModuleName:AlarmModule,AssemblyName:MaxWell.Modules.AlarmModule,Enabled:true},{ModuleName:VisionModule,AssemblyName:MaxWell.Modules.VisionModule,Enabled:false}]}动态加载实现App.xaml.csprotectedoverridevoidConfigureModuleCatalog(IModuleCatalogmoduleCatalog){varconfignewConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(appsettings.Modules.json,optional:false,reloadOnChange:true).Build();varmodulesconfig.GetSection(Modules).GetListModuleConfig();foreach(varminmodules.Where(mm.Enabled)){vartypeType.GetType(${m.ModuleName}.{m.ModuleName},{m.AssemblyName});if(type!null){moduleCatalog.AddModule(type);}}}publicclassModuleConfig{publicstringModuleName{get;set;}string.Empty;publicstringAssemblyName{get;set;}string.Empty;publicboolEnabled{get;set;}true;publicListstringDependsOn{get;set;}new();}4. 模块依赖管理DependsOn使用 DependsOn 属性[Module(ModuleNameAlarmModule)][ModuleDependency(ExperimentModule)]// 依赖 ExperimentModulepublicclassAlarmModule:IModule{// ...}代码方式依赖publicclassAlarmModule:IModule{publicvoidRegisterTypes(IContainerRegistrycontainerRegistry){// ...}publicvoidOnInitialized(IContainerProvidercontainerProvider){// 确保依赖模块已初始化}}完整集成建议核心模块InfrastructureModule放在最先加载业务模块通过DependsOn声明依赖关系动态配置通过appsettings.Modules.json控制启用/禁用模块间通信统一使用MediatR NotificationPrism EventAggregator需要我继续提供以下任意部分吗InfrastructureModule基础模块完整代码VisionModule视觉检测示例模块热加载运行时动态加载/卸载