如何将连接字符串注入外部程序集(项目)的控制器?
解决外部项目控制器注入主Web API连接字符串的问题
这个场景我碰到过好几次,核心就是要让主项目的依赖注入(DI)容器能“看见”外部项目里的控制器,同时把主项目的连接字符串注册成可注入的服务。下面是具体的实现步骤:
第一步:确保主项目的连接字符串配置正确
先检查你的主Web API项目的appsettings.json,确保连接字符串已经配置好,比如:
{ "ConnectionStrings": { "DefaultConnection": "Server=.;Database=YourDbName;Trusted_Connection=True;TrustServerCertificate=True" } }
第二步:在主项目中注册外部控制器和连接字符串
.NET 6+(Program.cs)
在主项目的Program.cs里,需要做两件事:一是让DI容器发现外部项目的控制器,二是把连接字符串注册为可注入的服务:
var builder = WebApplication.CreateBuilder(args); // 关键:将外部项目的程序集添加到控制器发现列表中 builder.Services.AddControllers() .AddApplicationPart(typeof(MyExternalController).Assembly); // 提取连接字符串并注册为单例服务 var defaultConnStr = builder.Configuration.GetConnectionString("DefaultConnection"); builder.Services.AddSingleton(defaultConnStr); var app = builder.Build(); // 常规中间件配置 app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
.NET Framework/老版本.NET(Startup.cs)
如果是用Startup.cs的项目,配置逻辑类似,放在ConfigureServices方法里:
public class Startup { public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddApplicationPart(typeof(MyExternalController).Assembly); var connStr = Configuration.GetConnectionString("DefaultConnection"); services.AddSingleton(connStr); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 中间件配置... app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
第三步:验证外部控制器的注入逻辑
你写的外部控制器代码是没问题的,只要构造函数是public的,DI容器就会自动把注册好的连接字符串注入进去:
public class MyExternalController : Controller { private string _connStr; public MyExternalController(string connStr) { _connStr = connStr; } // 你的Action方法... }
可能踩的坑
- 要确保主Web API项目已经引用了外部控制器所在的类库项目,不然程序集找不到。
- 如果外部控制器所在的项目有自己的DI配置,别和主项目的配置冲突,优先以主项目的配置为准。
内容的提问来源于stack exchange,提问作者user5227915
相关产品推荐
相关产品推荐

