核心思路是通过泛型工厂实现资源池的环境感知动态创建:定义泛型接口resourcepool(t : class, iresource, idisposable),工厂resourcefactory按环境名路由func,支持注册/获取/热切换,实例自动携带environmenttag。

核心思路是把“资源类型”和“环境策略”同时参数化,用泛型工厂封装创建逻辑,让资源池在启动或运行时按需加载对应实现,不硬编码、不反射强制转换、不牺牲类型安全。
泛型资源池接口定义
先定义一个强类型的资源池契约,明确生命周期与类型约束:
- 使用 泛型参数 T 表示资源实体类型(如
DbConnection、HttpClient、RedisClient) - 添加 约束
where T : class, IResource, IDisposable,确保可释放、有统一接口 - 方法返回
T而非object或IResource,避免运行时转型
环境感知的泛型工厂类
工厂不针对某一种资源写死,而是通过类型 + 环境标识双维度路由:
- 声明泛型工厂类
ResourceFactory<t></t>,内部维护Dictionary<string func>></string>,键为环境名(如"dev"、"prod"、"mock") - 提供注册方法:
Register(string env, Func<t> creator)</t>,例如factory.Register("prod", () => new SqlDbConnection(...)) - 提供获取方法:
T Get(string env = null),未指定时取默认环境(如从配置中心读取app.env)
运行时自适应加载机制
资源池本身不持有具体实现,只依赖工厂和环境上下文:
- 池初始化时调用
factory.Get(currentEnv)创建首个实例,并推导其健康检查、回收策略等元信息 - 支持热切换:当检测到环境变量变更(如 Kubernetes ConfigMap 更新),触发
RebuildPoolFor(env),用新环境的Func<t></t>替换全部实例 - 每个资源实例可自带
EnvironmentTag属性,在日志、指标、链路追踪中自动打标
实战组装示例(C# 风格)
以数据库连接池为例,三步完成解耦:
-
定义资源接口:
public interface IDbResource : IResource { string ConnectionString { get; } } -
注册多环境实现:
dbFactory.Register("dev", () => new LocalDbResource("Server=.;Database=test")); dbFactory.Register("prod", () => new AzureSqlResource("...")); -
业务层直取强类型实例:
IDbResource conn = pool.Acquire(); // 编译期已知是 IDbResource,不是 object










