如何在.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>();
方案二:修正工厂方法(仅当需要自定义实例逻辑时使用)
如果必须使用工厂方法注册,需要修正两个问题:
- 括号位置错误:
new ResultService()需要放在CustomerService的构造函数参数列表内 - 避免手动new依赖:从DI容器获取已注册的实例,而不是自己创建,确保依赖的生命周期由容器管理
修正后的代码:
services.AddTransient<ICustomerRepository>(c => new CustomerService( c.GetRequiredService<StockManagerContext>(), c.GetRequiredService<ITxnNoGenerationRepository>(), c.GetRequiredService<IResultRepository>() ) );
内容的提问来源于stack exchange,提问作者Shenal
相关产品推荐
相关产品推荐

