vs_plg_factory.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # vs_plg_factory.py
  2. import importlib.util
  3. import sys
  4. import os
  5. from vs_plg import IVSPlg
  6. from vs_log_macros import VSC_ERROR, VSC_INFO
  7. class VSPlgFactory:
  8. """
  9. @brief 签证插件工厂类
  10. 负责动态加载和创建 IVSPlg 接口的实现实例。
  11. """
  12. def __init__(self):
  13. self._registered_plugins = {} # {plugin_name: (module_name, class_name)}
  14. def register_plugin(self, plugin_name: str, module_path: str, class_name: str):
  15. """
  16. @brief 注册插件
  17. @param plugin_name 插件的逻辑名称
  18. @param module_path 插件模块的 Python 文件路径 (e.g., "plugins/concrete_plugin.py")
  19. @param class_name 插件实现类的名称 (e.g., "ConcretePlugin")
  20. """
  21. self._registered_plugins[plugin_name] = (module_path, class_name)
  22. VSC_INFO("factory", "Registered plugin '%s' from '%s' class '%s'", plugin_name, module_path, class_name)
  23. def create(self, group_id: str, plugin_name: str) -> IVSPlg:
  24. """
  25. @brief 创建一个 IVSPlg 实例
  26. @param group_id 实例所属的分组 ID
  27. @param plugin_name 要创建的插件的注册名称
  28. @return IVSPlg 实例
  29. """
  30. if plugin_name not in self._registered_plugins:
  31. VSC_ERROR("factory", "Plugin '%s' not registered.", plugin_name)
  32. raise ValueError(f"Plugin '{plugin_name}' not registered.")
  33. module_path, class_name = self._registered_plugins[plugin_name]
  34. try:
  35. # 动态加载模块
  36. spec = importlib.util.spec_from_file_location(plugin_name, module_path)
  37. if spec is None:
  38. VSC_ERROR("factory", "Failed to find module spec for '%s' at '%s'", plugin_name, module_path)
  39. raise ImportError(f"Could not find module spec for {plugin_name} at {module_path}")
  40. module = importlib.util.module_from_spec(spec)
  41. sys.modules[plugin_name] = module
  42. spec.loader.exec_module(module)
  43. # 获取类并实例化
  44. plugin_class = getattr(module, class_name)
  45. instance = plugin_class(group_id)
  46. if not isinstance(instance, IVSPlg):
  47. VSC_ERROR("factory", "Created instance for '%s' is not an IVSPlg.", plugin_name)
  48. raise TypeError(f"Plugin '{plugin_name}' class '{class_name}' does not implement IVSPlg.")
  49. VSC_INFO("factory", "Successfully created instance for group '%s' with plugin '%s'", group_id, plugin_name)
  50. return instance
  51. except Exception as e:
  52. VSC_ERROR("factory", "Failed to create plugin instance '%s': %s", plugin_name, str(e))
  53. raise