NET 6如何将AddDbContext注册代码迁移到Service静态扩展类
问题场景
我在.NET 6项目的Program.cs文件中编写了如下数据库上下文注册代码:
var idConnectionString = builder.Configuration.GetConnectionString("IdentityConnection"); builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(idConnectionString)); var abcConnectionString = builder.Configuration.GetConnectionString("abcConnection"); builder.Services.RegisterSqlServer<AbcDbContext>(abcConnectionString); var xyzConnectionString = builder.Configuration.GetConnectionString("xyzConnection"); builder.Services.AddDbContext<XzyDbContext>(x => x.UseSqlServer(xyzConnectionString));
需要将上述数据库上下文注册代码迁移到自定义的Service扩展类中,现有扩展类结构如下:
public static class ServiceExtensions { public static IServiceCollection AddDbContextServices(this IServiceCollection services) { // 待填充注册逻辑 return services; } }
实现步骤
- 调整扩展方法签名,传入配置实例
原注册逻辑依赖IConfiguration读取连接字符串,给扩展方法增加IConfiguration类型入参,把Program.cs中的注册逻辑直接平移到扩展方法内部即可,完整扩展类代码如下:using Microsoft.EntityFrameworkCore; // 引入项目中DbContext、自定义RegisterSqlServer扩展方法所在的命名空间 public static class ServiceExtensions { public static IServiceCollection AddDbContextServices(this IServiceCollection services, IConfiguration configuration) { // 注册ApplicationDbContext var idConnectionString = configuration.GetConnectionString("IdentityConnection"); services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(idConnectionString)); // 注册AbcDbContext var abcConnectionString = configuration.GetConnectionString("abcConnection"); services.RegisterSqlServer<AbcDbContext>(abcConnectionString); // 注册XzyDbContext var xyzConnectionString = configuration.GetConnectionString("xyzConnection"); services.AddDbContext<XzyDbContext>(x => x.UseSqlServer(xyzConnectionString)); return services; } } - 替换
Program.cs中的注册代码
删除原来写在Program.cs里的零散DbContext注册代码,替换为一行扩展方法调用:builder.Services.AddDbContextServices(builder.Configuration);
注意:如果编译时提示找不到
UseSqlServer、RegisterSqlServer方法或者各个DbContext类型,先检查命名空间引用:UseSqlServer需要引用Microsoft.EntityFrameworkCore以及SqlServer提供器包Microsoft.EntityFrameworkCore.SqlServer,自定义的RegisterSqlServer方法和各个DbContext需要引用项目内对应的命名空间。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

