MITK 工程四大组结构分析 MITK 工程四大组结构分析Applications / CppMicroServices / Modules / Plugins 的作用与关系概述MITK 工程在解决方案中分为四个组。先说明一点在源码树中CppMicroServices实际位于Modules/CppMicroServices/但因为它是独立的第三方项目有自己的 LICENSE、README、CMake 体系在 VS 解决方案里被单列为一个组。组数量一句话定位CppMicroServices1服务总线C 版 OSGi 微服务框架接口注册/发现Modules77引擎和零件算法与控件动态库可脱离工作台复用Plugins82仪表盘BlueBerry 工作台插件View/Editor/PerspectiveApplications2点火钥匙可执行程序壳main() 插件清单一、CppMicroServices —— 服务注册中枢最底层位置Modules/CppMicroServices/core/module、core/service、core/utilC 版的 OSGi 微服务框架来自独立开源项目。提供接口注册/发现机制模块 A 注册一个服务接口的实现模块 B 只凭接口类型就能查到它双方零编译依赖。// Modules/Core/src/Interactions/mitkDisplayActionEventBroadcast.cpp: L48 —— 实际用法m_ServiceRegistrationus::GetModuleContext()-RegisterServiceInteractionEventObserver(this,props);MITK 内部大量能力靠它解耦IO 读写器各文件格式的 Reader/Writer 以服务注册渲染服务、交互事件观察者InteractionEventObserverDataStorage 服务IDataStorageService二、Modules —— 算法与功能库核心主体77 个纯 C 动态库每个用mitk_create_module()声明见Modules/Core/CMakeLists.txt。内部分层层例子说明基础核心CoreDataStorage、BaseRenderer、RenderingManager、SliceNavigationController、Log一切的地基算法领域Segmentation、DICOM、IGT、ImageStatistics、ContourModel医学影像算法Qt 控件QtWidgetsQmitkRenderWindow、QmitkStdMultiWidget、各*UI后缀模块可复用 UI 控件但不含工作台逻辑应用支撑AppUtilmitkBaseApplication、CoreCmdApps启动器骨架 / 纯命令行工具模块声明示例Modules/Core/CMakeLists.txtmitk_create_module( DEPENDS PUBLIC MitkLog CppMicroServices # ← Module 依赖服务总线 PACKAGE_DEPENDS PUBLIC Boost nlohmann_json ITK|IOImageBase... VTK|FiltersTexture... # ← 第三方库按需引组件 )关键特征Module 不依赖 BlueBerry/Plugins——可以脱离工作台在任何 Qt/命令行程序里单独使用CoreCmdApps就是纯命令行用法。这是 MITK 算法可独立复用的设计基石。三、Plugins —— 工作台功能插件UI 组装层82 个CTK/BlueBerry 插件每个用mitk_create_plugin()声明带plugin.xml贡献 View/Editor/Perspective 扩展。两大类前缀角色例子org.blueberry.*BlueBerry 框架本身Eclipse RCP 移植层org.blueberry.ui.qtWorkbench、presentation 框架、org.blueberry.core.runtimeExtensionRegistryorg.mitk.gui.qt.*MITK 功能界面datamanager、segmentation、mxnmultiwidgeteditor、stdmultiwidgeteditor插件声明示例org.mitk.gui.qt.datamanager# CMakeLists.txt —— 编译期链接 Module mitk_create_plugin( EXPORT_DIRECTIVE MITK_QT_DATAMANAGER EXPORTED_INCLUDE_SUFFIXES src MODULE_DEPENDS MitkQtWidgetsExt) # ← 依赖 Modules 层# manifest_headers.cmake —— 运行期插件间依赖 set(Plugin-Name MITK Data Manager) set(Require-Plugin org.mitk.gui.qt.application org.mitk.gui.qt.common)角色Plugin 是 Module 与工作台之间的胶水把 Module 里的控件/算法包装成View/Editor 插入 Workbench。两套依赖声明各司其职MODULE_DEPENDS—— 编译期链接哪些 Module 库Require-Plugin—— 运行期需要哪些其他插件先激活四、Applications —— 可执行程序最顶层仅 2 个Applications/AppList.cmakeset(MITK_APPS Workbench^^MITK_BUILD_APP_Workbench^^MitkWorkbench # 默认 ON FlowBench^^MITK_BUILD_APP_FlowBench^^MitkFlowBench # 默认 OFF )main() 有多薄Applications/Workbench/MitkWorkbench.cppintmain(intargc,char**argv){mitk::BaseApplicationapp(argc,argv);// 来自 Modules/AppUtilapp.setSingleMode(true);app.setApplicationName(MITK Workbench);app.setOrganizationName(DKFZ);...returnapp.run();// 其余全交给插件框架}真正内容全部由插件提供App 只在target_libraries.cmake里声明装载哪些插件# Applications/Workbench/target_libraries.cmake set(target_libraries org_blueberry_ui_qt # 工作台框架 org_mitk_gui_qt_extapplication # 扩展应用外壳传递拉入其余插件 )CTK 的依赖图工具DGraph见 AppList.cmake 注释会自动解析插件传递依赖把需要的全部插件启用。五、依赖关系严格单向自下而上Applications 壳 —— main 插件清单装载运行期由 CTK 解析 plugin.xmlMODULE_DEPENDS 编译期链接DEPENDS PUBLIC CppMicroServicesCppMicroServices 服务总线接口注册 / 发现Modules 算法与控件库 —— 可独立复用QtWidgets 与各 UI 模块 —— Qt 控件层Core —— 数据 / 渲染 / 交互核心Segmentation / DICOM / IGT —— 算法层Plugins 工作台功能 —— View / Editor / PerspectiveRequire-Plugin 运行期依赖org.blueberry.* 框架层org.mitk.gui.qt.* 功能界面MitkWorkbench BaseApplication 插件列表规则依赖只能向下App → Plugin → Module → CppMicroServices反向不允许——Module 永远不知道 Plugin 的存在。横向解耦靠两套机制Module 之间CppMicroServices 服务编译期只依赖接口Plugin 之间BlueBerry 扩展点plugin.xml 声明运行期装配分层收益算法Modules可以不带 GUI 复用到第三方程序界面Plugins可按需增删不改一行核心代码换一个应用Applications只是换一份插件清单小结CppMicroServices 是总线Modules 是引擎和零件Plugins 是装在工作台上的仪表盘Applications 只是点火钥匙。关键文件索引内容文件应用清单Applications/AppList.cmakeWorkbench 入口Applications/Workbench/MitkWorkbench.cppApp 插件清单Applications/Workbench/target_libraries.cmakeModule 声明宏示例Modules/Core/CMakeLists.txtmitk_create_modulePlugin 声明宏示例Plugins/org.mitk.gui.qt.datamanager/CMakeLists.txtmitk_create_pluginPlugin 运行期依赖Plugins/org.mitk.gui.qt.datamanager/manifest_headers.cmake微服务框架Modules/CppMicroServices/core/module、core/service微服务用法示例Modules/Core/src/Interactions/mitkDisplayActionEventBroadcast.cpp: L48