.NET 7清洁架构中数据库连接配置与DbContext调用咨询
我在.NET 7中搭建了包含Author.Domain、Author.Application、Author.Infrastructure三层的Clean Architecture + ASP.NET Web API项目。此前常规开发时,我会在appsettings.json中编写连接字符串,在Program.cs中配置CORS与数据库,创建DbContext后在控制器中调用以获取数据库数据。但当前项目的数据获取逻辑写在Infrastructure层的AuthorRepository类中(目前为硬编码列表),我想了解:
- 该项目中数据库连接配置应放在何处?
- 如何在AuthorRepository中调用DbContext以实现从数据库获取数据?
项目分层
- Author.Domain
- Author.Application
- Author.Infrastructure
Author.Domain层
在领域层中创建了AuthorViewModel类:
public class AuthorViewModel { [Key] [Column("UID")] public int AuthorUID { get; set; } [Required] public String AuthorFirstName { get; set; } [Required] public String AuthorLastName { get; set; } public int PublisherID { get; set; } }
Author.Application层
在应用层创建了一个类与两个接口:
- AuthorService
- IAuthorRepository
- IAuthorService
IAuthorRepository
public interface IAuthorRepository { List<Domain.AuthorViewModel> GetAllAuthor(); }
IAuthorService
public interface IAuthorService { List<Domain.AuthorViewModel> GetAllAuthor(); }
AuthorService
public class AuthorService : IAuthorService { private readonly IAuthorRepository authorRepository; public AuthorService(IAuthorRepository authorRepository) { this.authorRepository = authorRepository; } List<Domain.AuthorViewModel> IAuthorService.GetAllAuthor() { return this.authorRepository.GetAllAuthor(); } }
Author.Infrastructure层
在基础设施层创建了AuthorRepository类:
public class AuthorRepository : IAuthorRepository { public static List<Domain.AuthorViewModel> lstAuthor = new List<Domain.AuthorViewModel>() { new Domain.AuthorViewModel{ AuthorUID =1 ,AuthorFirstName= "Kirtesh Shah", AuthorLastName ="G" }, new Domain.AuthorViewModel{ AuthorUID =2 ,AuthorFirstName= "Mahesh Shah", AuthorLastName ="S" }, new Domain.AuthorViewModel{ AuthorUID =3 ,AuthorFirstName= "Nitya Shah", AuthorLastName ="G" }, new Domain.AuthorViewModel{ AuthorUID =4 ,AuthorFirstName= "Dilip Shah", AuthorLastName ="S" }, new Domain.AuthorViewModel{ AuthorUID =5 ,AuthorFirstName= "Hansa Shah", AuthorLastName ="S" }, new Domain.AuthorViewModel{ AuthorUID =6 ,AuthorFirstName= "Mita Shah", AuthorLastName ="G" } }; public List<Domain.AuthorViewModel> GetAllAuthor() { return lstAuthor; } }
API控制器:AuthorController
[Route("api/[controller]/[action]")] [ApiController] public class AuthorController : ControllerBase { private readonly IAuthorService authorService; public AuthorController(IAuthorService authorService) { this.authorService = authorService; } // GET: api/<MembersController> [HttpGet] public ActionResult<IList<AuthorViewModel>> Get() { return Ok(this.authorService.GetAllAuthor()); } }
问题解答
1. 数据库连接配置的存放位置
在Clean Architecture架构中,数据库连接字符串依然存放在Web API项目的appsettings.json中——配置属于应用启动的外部依赖,由最外层的Web项目管理符合架构原则。
示例appsettings.json配置:
{ "ConnectionStrings": { "AuthorDb": "Server=.;Database=AuthorDB;Trusted_Connection=True;TrustServerCertificate=True;" }, // 其他配置项 }
2. 在AuthorRepository中调用DbContext的实现步骤
步骤1:在Infrastructure层创建DbContext
先给Infrastructure层安装Microsoft.EntityFrameworkCore和对应数据库的Provider包(比如SQL Server的Microsoft.EntityFrameworkCore.SqlServer),然后创建DbContext类:
using Microsoft.EntityFrameworkCore; using Author.Domain; namespace Author.Infrastructure { public class AuthorDbContext : DbContext { public AuthorDbContext(DbContextOptions<AuthorDbContext> options) : base(options) { } // 映射领域实体到数据库表 public DbSet<AuthorViewModel> Authors { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 可选:配置实体与表的映射规则,比如指定表名 modelBuilder.Entity<AuthorViewModel>().ToTable("Authors"); } } }
步骤2:在Infrastructure层编写服务注册扩展方法
创建静态类封装DbContext和Repository的注册逻辑,遵循依赖倒置原则,让Web层只需要调用扩展方法即可:
using Microsoft.Extensions.DependencyInjection; using Microsoft.EntityFrameworkCore; using Author.Application; namespace Author.Infrastructure { public static class InfrastructureServiceRegistration { public static IServiceCollection AddInfrastructureServices(this IServiceCollection services, IConfiguration configuration) { // 注册DbContext,从配置读取连接字符串 services.AddDbContext<AuthorDbContext>(options => options.UseSqlServer(configuration.GetConnectionString("AuthorDb"))); // 注册Repository的依赖注入 services.AddScoped<IAuthorRepository, AuthorRepository>(); return services; } } }
步骤3:在Web项目的Program.cs中注册服务
var builder = WebApplication.CreateBuilder(args); // 注册基础设施层服务 builder.Services.AddInfrastructureServices(builder.Configuration); // 注册应用层服务 builder.Services.AddScoped<IAuthorService, AuthorService>(); // 配置CORS(按需调整规则) builder.Services.AddCors(options => { options.AddPolicy("AllowAll", policy => { policy.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); builder.Services.AddControllers(); var app = builder.Build(); // 启用CORS app.UseCors("AllowAll"); app.MapControllers(); app.Run();
步骤4:修改AuthorRepository注入DbContext并查询数据库
将硬编码数据替换为从DbContext查询的逻辑,通过构造函数注入AuthorDbContext:
using Author.Application; using Author.Domain; using Microsoft.EntityFrameworkCore; namespace Author.Infrastructure { public class AuthorRepository : IAuthorRepository { private readonly AuthorDbContext _dbContext; // 构造函数注入DbContext public AuthorRepository(AuthorDbContext dbContext) { _dbContext = dbContext; } public List<Domain.AuthorViewModel> GetAllAuthor() { // 从数据库查询所有作者数据 return _dbContext.Authors.ToList(); } } }
内容的提问来源于stack exchange,提问作者Sruthi

