You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 13:20:21