.NET 8带键瞬态DI注册SftpClient编译错误及IServiceProvider使用疑问
解决.NET 8带键依赖注入注册SftpClient的编译错误
你的编译错误是因为**AddKeyedTransient没有直接接受实例的重载**——和非键的AddTransient<T>(T instance)不同,带键版本要求你传入工厂委托(Func<IServiceProvider, object?, T>)来创建实例,而非直接传递已实例化的对象。
正确的单实例注册方式
把实例创建逻辑包装到工厂委托里即可,单个SFTP提供者的修改示例:
var hostname1 = "hostname"; var portNo1 = 22; var username1 = "username"; var password1 = "password"; services.AddKeyedTransient<SftpClient>("SFTP1", (serviceProvider, key) => new SftpClient(hostname1, portNo1, username1, password1));
三个SFTP提供者的完整注册示例
如果要注册三个不同的SFTP客户端,可以按如下方式批量处理:
// 注册SFTP1 var sftp1Config = new { Host = "hostname1", Port = 22, Username = "user1", Password = "pass1" }; services.AddKeyedTransient<SftpClient>("SFTP1", (_, __) => new SftpClient(sftp1Config.Host, sftp1Config.Port, sftp1Config.Username, sftp1Config.Password)); // 注册SFTP2 var sftp2Config = new { Host = "hostname2", Port = 22, Username = "user2", Password = "pass2" }; services.AddKeyedTransient<SftpClient>("SFTP2", (_, __) => new SftpClient(sftp2Config.Host, sftp2Config.Port, sftp2Config.Username, sftp2Config.Password)); // 注册SFTP3 var sftp3Config = new { Host = "hostname3", Port = 22, Username = "user3", Password = "pass3" }; services.AddKeyedTransient<SftpClient>("SFTP3", (_, __) => new SftpClient(sftp3Config.Host, sftp3Config.Port, sftp3Config.Username, sftp3Config.Password));
注入方式保持不变
你原来的注入代码是正确的,无需修改:
public IActionResult Get([FromKeyedServices("SFTP1")] SftpClient client) { // 在这里使用SFTP客户端处理业务逻辑 }
补充说明
工厂委托的两个参数:
serviceProvider:如果SftpClient创建需要依赖其他已注册服务,可通过此参数获取key:即注册时指定的标识(如"SFTP1"),若需根据键动态调整实例逻辑,可使用此参数
内容的提问来源于stack exchange,提问作者perpetual_noob
相关产品推荐
相关产品推荐

