Program.cs常用API解析
我们新建ASP.NET Core项目时,会自动生成这样一个入口文件,这里配置很多东西,但是我们也会有很多疑问,这些API到底是干啥的
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
//添加用于将 HTTP 请求重定向到 HTTPS 的中间件。
app.UseHttpsRedirection();
//为当前请求路径启用静态文件服务
app.UseStaticFiles();
app.UseAuthorization();
//向与指定模式的 HTTP GET 请求匹配的项添加一个RouteEndpointIEndpointRouteBuilder。
app.MapGet("/hi", () => "Hello!");
//向控制器操作 IEndpointRouteBuilder 添加终结点,并添加默认路由 {controller=Home}/{action=Index}/{id?}。
app.MapDefaultControllerRoute();
//将 Razor Pages 的终结点添加到 IEndpointRouteBuilder.
app.MapRazorPages();
app.Run();
好,现在从第一句var builder = WebApplication.CreateBuilder(args);
来看,首先是WebApplication
-
WebApplication
- 用于配置 HTTP 管道和路由的 Web 应用程序,以下是WebApplication
-
详细的API可以去文档查看 WebApplication 类 (Microsoft.AspNetCore.Builder) | Microsoft Learn
-
这里主要介绍下
CreateBuilder()
方法和Run()
-
CreateBuilder()
-
这个方法如图,返回一个
WebApplicationBuilder
对象,它是Web 应用程序和服务的生成器,主要用来注册服务,和配置依赖注入等 -
// // 摘要: // A builder for web applications and services. public sealed class WebApplicationBuilder { public IWebHostEnvironment Environment { get; } //要撰写的应用程序的服务集合,比如我们Program.cs里面注册的 //builder.Services.AddRazorPages(); //builder.Services.AddControllersWithViews(); public IServiceCollection Services { get; } //要撰写的应用程序的配置提供程序的集合, public ConfigurationManager Configuration { get; } //应用程序要撰写的日志记录提供程序的集合。 这对于添加新日志记录提供程序非常有用。 public ILoggingBuilder Logging { get; } //IWebHostBuilder用于配置服务器特定属性,但不生成。 若要在配置后生成,请调用 Build()。 public ConfigureWebHostBuilder WebHost { get; } //用于 IHostBuilder 配置主机特定属性,但不生成。 若要在配置后生成,请调用 Build()。 public ConfigureHostBuilder Host { get; } //只有这个方法,这个方法的返回值是WebApplication,在配置完成后调用来启动程序 public WebApplication Build(); }
-
-
Run()
方法- 运行应用程序并阻止调用线程,直至主机关闭。
-
EF Core在分层项目中的使用
项目结构
-
步骤
-
建立类库项目,放实体类,DbContext,配置类等,DbContext中不配置数据库连接,而是为了DbContext增加一个DbContextOptions类型的构造函数,需要通过NuGet为项目安装
Microsoft.EntityFrameworkCore
-
public class Book { public long Id { get; set; } public string Title { get; set; } public string AuthorName { get; set; } public double Price { get; set; } public DateTime PubDate { get; set; } } public class BookConfig : IEntityTypeConfiguration<Book> { public void Configure(EntityTypeBuilder<Book> builder) { builder.ToTable("T_Books"); } } public class MyDbContext:DbContext { public DbSet<Book> Books { get; set; } public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { } //创建上下文 protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //从提供程序集中定义的所有 IEntityTypeConfiguration<TEntity> /> 实例应用配置。 modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly); } }
-
-
EF Core项目安装对应数据库的EF Core Provider
Instal-Package Microsoft.EntityFrameworkCore.SqlServer
Instal-Package Microsoft.EntityFrameworkCore.Tools
-
ASP.NET Core项目引用EF Core项目,并且通过AddDbContext来注入DbContext及对DbContext进行配置
-
这里保存数据连接字符串是在是在机密文件中
secrets.json
-
{ "ConnStr": "Data Source=.;Initial Catalog=demo666;Integrated Security=SSPI;TrustServerCertificate=yes" }
-
-
对DbContext的配置是在Program.cs中
-
builder.Services.AddDbContext<MyDbContext>(opt => { string? connStr = builder.Configuration.GetSection("ConnStr").Value; opt.UseSqlServer(connStr); }); var app = builder.Build();
-
-
-
Controller中就可以注入DbContext类中使用了
-
[Route("api/[controller]/[action]")] [ApiController] public class TestController : ControllerBase { private readonly MyDbContext myDbContext; public TestController(MyDbContext myDbContext) { this.myDbContext = myDbContext; } [HttpGet] public string Demo1() { int c = myDbContext.Books.Count(); return $"c={c}"; } }
-
-
让开发环境的Add-Migration知道连接哪个数据库在EFCore项目中创建一个实现了
IDesignTimeDbContextFactory
的类并且在CreateDbContext
返回一个连接开发数据库的DbContext-
public class MyDbContextDesignFac : IDesignTimeDbContextFactory<MyDbContext> { public MyDbContext CreateDbContext(string[] args) { DbContextOptionsBuilder<MyDbContext> options = new DbContextOptionsBuilder<MyDbContext>(); string connStr = "Data Source=.;Initial Catalog=demo666;Integrated Security=SSPI;TrustServerCertificate=yes"; options.UseSqlServer(connStr); MyDbContext myDbContext = new MyDbContext(options.Options); return myDbContext; } }
-
-
执行数据库迁移,
Add-Migration Update-database
,需要把EF Core项目设置为启动项目,需要安装一些包
-