租户隔离不能依赖构造函数自动处理,必须显式传入tenantId等标识并绑定实例;API路径、数据库连接、缓存键名等均需内嵌租户信息,避免静态方法或共享状态导致跨租户污染,推荐结合DI容器动态解析租户感知服务。

构造函数本身不处理多租户隔离,它只是创建单个实例的工具。真正的租户隔离需在实例初始化、数据访问、配置注入或运行时上下文层面主动设计。
租户标识必须在构造时传入
不能依赖全局变量或静态状态来区分租户。每个实例应明确绑定所属租户,通常通过构造参数传递租户 ID 或租户上下文对象。
- 推荐方式:将 tenantId 作为必填参数传入构造函数
- 避免方式:在构造函数里读取
window.tenant或process.env.TENANT这类共享环境值 - 示例:
new UserService({ tenantId: 'acme-corp', apiBase: '/api/acme' })
实例内部封装租户敏感逻辑
构造后,所有方法(如 fetchUsers()、saveConfig())应自动携带租户上下文,不暴露原始请求细节。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- API 请求路径、数据库连接、缓存键名都应内嵌 tenantId
- 可借助闭包或私有字段保存租户信息,防止被外部篡改
- 例如:
this.cacheKey = `users:${this.tenantId}:${userId}`
避免静态方法或共享状态泄露租户数据
构造函数定义的静态方法(如 UserFactory.create())若操作共享资源(如单例缓存、全局 axios 实例),极易造成跨租户污染。
立即学习“Java免费学习笔记(深入)”;
- 静态方法只做无状态的工厂逻辑,不持有租户数据
- 真正带租户行为的逻辑必须放在实例方法中
- 若需复用 HTTP 客户端,应为每个租户创建独立实例,或使用带租户拦截器的请求适配器
结合依赖注入更安全地管理租户上下文
在复杂应用中,建议用轻量 DI 容器(如 InversifyJS 或自建上下文栈)统一提供租户感知的服务实例,而非让每个构造函数手动传参。
- 请求进入时解析租户(如从域名、Header 或 JWT),生成租户上下文
- 容器根据上下文动态 resolve 对应租户的 UserService、Logger 等实例
- 构造函数保持纯净,专注自身职责,租户耦合由容器承担

















