用注册表消灭 if-else:在线工具模块的插拔式设计

新增工具时只新增一个处理器文件,路由、服务与页面都不需要改——这就是开闭原则的实际收益。

用注册表消灭 if-else:在线工具模块的插拔式设计

在线工具模块最容易写成巨型 if tool_name == ...。每加一个工具,路由、校验、前端都要改一遍,典型的霰弹式修改。

抽象出处理器接口

class BaseTool(ABC):
    slug: str
    name: str
    fields: tuple[ToolField, ...]

    @abstractmethod
    def execute(self, payload: Mapping[str, str]) -> ToolResult:
        ...

处理器只关心「输入 → 输出」,不接触请求对象,也不处理权限。

自动发现而不是手工注册

注册表遍历 handlers 包,导入模块后收集所有 BaseTool 子类:

for module in pkgutil.iter_modules(package.__path__):
    importlib.import_module(f"{package.__name__}.{module.name}")

新增工具只需新增文件,注册表自动接管。

服务层统一横切能力

参数校验、会员权限、每日配额、使用审计都在服务层完成:

权限 → 校验 → 配额 → 执行 → 审计

处理器因此可以保持极简,测试也只需要构造一个字典。

结果

新增工具的成本从一个「跨文件改动」变成「新增一个文件」。这就是可扩展性的可度量定义。