依赖注入中多连接字符串的泛型实现可行性及替代方案咨询
解答
你最初的泛型写法不可行——因为当前只定义了非泛型的ISQLDataAccessor接口,ISQLDataAccessor<store2>这种泛型版本根本不存在,编译器会直接报错。要实现泛型区分的逻辑,需要补全泛型接口的定义:
泛型方案的正确实现步骤
- 定义泛型标记接口
// 泛型接口继承原有非泛型接口,TMarker作为标记类 public interface ISQLDataAccessor<TMarker> : ISQLDataAccessor where TMarker : class { } // 保留原有非泛型接口 public interface ISQLDataAccessor { }
- 创建空的标记类(仅用于区分实例,不需要任何业务逻辑)
public class store2 { } public class store3 { }
- 修改数据访问器实现泛型接口
public class SQLDataAccessor : ISQLDataAccessor, ISQLDataAccessor<store2>, ISQLDataAccessor<store3> { public SQLDataAccessor(string sqlconnectionstring) { sqlConnectionString = sqlconnectionstring; } }
- 按预期配置依赖注入
services.AddTransient<ISQLDataAccessor>(sp => new SQLDataAccessor(sp.GetRequiredService<IOptions<APIConfiguration>>().Value.DataBase.DefaultDSDN)); services.AddTransient<ISQLDataAccessor<store2>>(sp => new SQLDataAccessor(sp.GetRequiredService<IOptions<APIConfiguration>>().Value.DataBase.SecondDSDN)); services.AddTransient<ISQLDataAccessor<store3>>(sp => new SQLDataAccessor(sp.GetRequiredService<IOptions<APIConfiguration>>().Value.DataBase.ThirdDSDN));
使用时通过泛型接口获取对应实例:
public class MyBusinessService { private readonly ISQLDataAccessor _defaultDb; private readonly ISQLDataAccessor<store2> _store2Db; public MyBusinessService(ISQLDataAccessor defaultDb, ISQLDataAccessor<store2> store2Db) { _defaultDb = defaultDb; _store2Db = store2Db; } }
两种方案对比
- 你的子接口方案可行,但缺点明显:每新增一个数据库连接,就得额外定义一个新接口,扩展性差,接口数量会随连接数线性增长。
- 泛型标记类方案更灵活:新增连接只需要加一个空标记类和对应的注入配置,不需要修改现有接口和实现类,维护成本更低。
内容的提问来源于stack exchange,提问作者Carrie Kaski
相关产品推荐
相关产品推荐

