.NET Core 6.0 Minimal API如何向仓储传递连接字符串?
解决方案:修复仓储的依赖注入问题
问题根源是手动实例化仓储类绕过了.NET Core的依赖注入容器,导致IConfiguration无法自动注入到仓储中。以下是具体修复步骤:
1. 规范仓储接口定义(可选但推荐)
确保仓储接口包含所有业务需要的方法,命名更具语义性(原IMovie建议改为IMovieRepository):
namespace MinimalJwt.Repositories { public interface IMovieRepository { Movie CreateNewMovie(Movie movie); IList<Movie> GetMovies(); // 其他仓储方法按需添加 } }
若已使用
IMovie接口,只需确保它包含对应方法即可,无需强制改名。
2. 修改MovieService,通过构造函数注入仓储接口
移除手动实例化的MovieRepository,改为注入仓储接口,让DI容器管理依赖:
namespace MinimalJwt.Services { public class MovieService : IMovieService { private readonly IMovieRepository _movieRepository; // 构造函数注入仓储接口 public MovieService(IMovieRepository movieRepository) { _movieRepository = movieRepository; } public Movie Create(Movie movie) { return _movieRepository.CreateNewMovie(movie); } } }
3. 在Program.cs中注册服务与仓储到DI容器
在builder.Build()之前,添加服务注册代码,让DI容器知晓接口与实现类的映射:
var builder = WebApplication.CreateBuilder(args); // 注册服务层和仓储层(Scoped生命周期适配Web请求场景) builder.Services.AddScoped<IMovieService, MovieService>(); builder.Services.AddScoped<IMovieRepository, MovieRepository>(); // 原有配置(如JWT认证等)保留 // ... var app = builder.Build(); // 端点定义保留 // ...
生命周期说明:
AddScoped表示每个HTTP请求创建一个实例,是Web项目的常规选择;若有特殊需求,可替换为AddTransient(每次请求创建新实例)或AddSingleton(全局单例)。
4. 优化仓储类的字段访问修饰符(可选)
将仓储类的_configuration字段改为private readonly,符合C#编码规范:
namespace MinimalJwt.Repositories { public class MovieRepository : IMovieRepository { private readonly IConfiguration _configuration; public MovieRepository(IConfiguration config) { _configuration = config; } // 原有GetMovies方法不变 public IList<Movie> GetMovies() { // ... 原代码可正常读取连接字符串 } // 实现CreateNewMovie方法 public Movie CreateNewMovie(Movie movie) { // 使用_configuration.GetConnectionString("MoviesContextDb")获取连接字符串,编写ADO.NET创建逻辑 } } }
修复原理
.NET Core的依赖注入容器会自动处理依赖链:当API端点请求IMovieService时,容器会创建MovieService实例,同时自动创建依赖的MovieRepository实例;而MovieRepository需要的IConfiguration,容器已默认从appsettings.json加载并注册,因此会自动注入到仓储中,最终解决连接字符串无法读取的问题。
内容的提问来源于stack exchange,提问作者paula.em.lafon
相关产品推荐
相关产品推荐

