You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7清洁架构中数据库连接配置与DbContext调用咨询

Clean Architecture + ASP.NET Web API(.NET 7)数据库配置与Repository调用问题

我在.NET 7中搭建了包含Author.Domain、Author.Application、Author.Infrastructure三层的Clean Architecture + ASP.NET Web API项目。此前常规开发时,我会在appsettings.json中编写连接字符串,在Program.cs中配置CORS与数据库,创建DbContext后在控制器中调用以获取数据库数据。但当前项目的数据获取逻辑写在Infrastructure层的AuthorRepository类中(目前为硬编码列表),我想了解:

  1. 该项目中数据库连接配置应放在何处?
  2. 如何在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层

在应用层创建了一个类与两个接口:

  1. AuthorService
  2. IAuthorRepository
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:47:50