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

如何在.NET DI容器中正确传递C#服务类的构造函数依赖?

如何正确在DI容器中为类构造函数传递依赖?

我在尝试将DI容器中的依赖传递给类构造函数时遇到了问题,以下是我的服务注册代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddDbContext<StockManagerContext>(o =>
        o.UseSqlServer(Configuration.GetConnectionString("connectionString")));
    services.AddTransient<ITxnNoGenerationRepository, TxnNoGenerationService>();
    services.AddScoped<IResultRepository, ResultService>();
    services.AddTransient<ICustomerRepository>(c => // 此处编译错误
        new CustomerService(
            c.GetRequiredService<StockManagerContext>(),
            new TxnNoGenerationService(
                c.GetRequiredService<StockManagerContext>())),
            new ResultService());
}

编译器提示错误:

没有与“CustomerService.CustomerService(StockManagerContext,ITxnNoGenerationRepository,IResultRepository)”的必需参数“resultrepository”对应的实参

我的接口定义如下:

public interface ICustomerRepository
{
    Task<Result> Get();
    Task<Result> Post(CustomerDetail customerDetail);
}

public interface IResultRepository
{
    Result ReturnSuccessResult();
    Result ReturnErrorResult();
}

public interface ITxnNoGenerationRepository
{
    Task<NextNo> TxnNoGeneration(string code);
}

引发错误的服务类代码:

public class CustomerService : ICustomerRepository
{
    private readonly StockManagerContext _context;
    private readonly ITxnNoGenerationRepository _txnNoGenerationRepositiory;
    private readonly IResultRepository _resultRepository;

    public CustomerService(
        StockManagerContext context,
        ITxnNoGenerationRepository txnNoGenerationRepository,
        IResultRepository resultRepository)
    {
        _context = context;
        _resultRepository = _resultRepository;
        _txnNoGenerationRepositiory = txnNoGenerationRepository;
    }

    public async Task<Result> Get() ...

    public async Task<Result> Post(CustomerDetail customerDetail) ...
}

解决方法

方案一:使用自动依赖注入(推荐)

你已经在DI容器中注册了StockManagerContext、ITxnNoGenerationRepository和IResultRepository,容器会自动解析这些依赖并注入到CustomerService的构造函数中,无需手动创建实例。直接替换ICustomerRepository的注册代码:

services.AddTransient<ICustomerRepository, CustomerService>();

方案二:修正工厂方法(仅当需要自定义实例逻辑时使用)

如果必须使用工厂方法注册,需要修正两个问题:

  1. 括号位置错误:new ResultService()需要放在CustomerService的构造函数参数列表内
  2. 避免手动new依赖:从DI容器获取已注册的实例,而不是自己创建,确保依赖的生命周期由容器管理

修正后的代码:

services.AddTransient<ICustomerRepository>(c => 
    new CustomerService(
        c.GetRequiredService<StockManagerContext>(),
        c.GetRequiredService<ITxnNoGenerationRepository>(),
        c.GetRequiredService<IResultRepository>()
    )
);

内容的提问来源于stack exchange,提问作者Shenal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:50:59