你不得不知道的 .NET CORE—— Startup 的秘密

本文探讨了ASP.NET Core中Startup类的多种指定方式及其有效性,并介绍了如何通过程序集查找及环境变量来自动选择不同的启动配置。

我们都知道,在 Main 函数中必须要指定一个 Startup 启动类,但下面的内容鲜为人知。

可以指定多个 Startup

static void Main(string[] args)
{
	WebHost.CreateDefaultBuilder(args)
		.UseStartup<Starup1>()
		.UseStartup<Startup2>()
		.UseStartup<Startup3>()
		//...
}

但结论却是,只有最后一个 Startup 启动类有效。我也是醉了。

如果我们不想指定一个启动类,系统默认会提供使用程序集查找,那查找的约定是怎样的呢?

WebHost.CreateDefaultBuilder(args)
		.UseStartup("程序集1;程序集2;...")

Startup 启动类的环境变量约定

环境变量内置分为三种:DevelopmentStagingProduction,当然你也可以用你自己的。 Core 的内部机制可以会结合你的 环境变量名 + Startup 来帮你找寻相应的启动类

static void Main(string[] args)
{
	WebHost.CreateDefaultBuilder(args)
		.UseStartup("MyApp")
		//...
}

public class DevelopmentStartup
{
	//...
}

public class ProductionStartup
{
	//...
}

当你在开发的时候会使用 DevelopmentStartup 启动类,当你在生产环境的时候就会切换到 ProductionStartup 启动类了。

类名后缀为 Startup 的约定

只要你的启动类的名称结尾是用 Startup 来命名的,都会视为启动类。

public class MyClassStartup {}

实现了 IStartup 接口的类

你的类如果实现了 IStartup 接口,同样也可以被系统找到。

public class MyClass : IStartup { }

如果以上条件不具备,就会抛出异常了。

### ASP.NET Core.NET 8.0 中使用 MVC 和 EF Core 进行数据访问 #### 一、概述 ASP.NET Core 是一种跨平台框架,用于构建现代 Web 应用程序和服务。随着即将发布的 .NET 8.0,其性能得到了显著提升,特别是在引入 native AOT 技术后[^2]。Entity Framework (EF) Core 是一个轻量级且可扩展的对象关系映射器(ORM),它允许开发者通过 C# 对象模型来管理数据库中的数据。 以下是关于如何在 ASP.NET Core.NET 8.0 中集成 MVC 架构以及使用 EF Core 实现数据访问的具体方法: --- #### 二、环境准备 1. **安装必要的工具和依赖项** - 安装最新版的 [.NET SDK](https://dotnet.microsoft.com/download),确保支持 .NET 8.0。 - 如果计划连接到 MySQL 数据库,则需安装 `Pomelo.EntityFrameworkCore.MySql` NuGet 包[^3]。 2. **创建项目** 使用命令行或 Visual Studio 创建一个新的 ASP.NET Core MVC 项目: ```bash dotnet new mvc --name MyMvcEfApp cd MyMvcEfApp ``` 3. **配置数据库上下文** 在项目的 `Models` 文件夹下定义实体类,并设置 DbContext 类以表示数据库结构。 --- #### 三、实现步骤 ##### 1. 添加实体类 假设我们有一个简单的 `Product` 表,可以定义如下实体类: ```csharp public class Product { public int Id { get; set; } public string Name { get; set; } = null!; public decimal Price { get; set; } } ``` ##### 2. 配置 DbContext 创建一个继承自 `Microsoft.EntityFrameworkCore.DbContext` 的类,用于管理实体对象与数据库之间的交互: ```csharp using Microsoft.EntityFrameworkCore; public class ApplicationDbContext : DbContext { public DbSet<Product> Products { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMySql( "server=localhost;database=mydb;uid=root;pwd=password;", ServerVersion.AutoDetect("server=localhost;database=mydb;uid=root;pwd=password;") ); } } ``` 注意:这里使用的字符串是针对 MySQL 数据库的连接字符串。 ##### 3. 注册服务 修改 `Program.cs` 或 `Startup.cs` 文件,注册 `ApplicationDbContext` 到依赖注入容器中: ```csharp builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(builder.Configuration.GetConnectionString("DefaultConnection"), ServerVersion.AutoDetect(builder.Configuration.GetConnectionString("DefaultConnection")))); ``` ##### 4. 控制器操作 创建控制器并编写 CRUD 方法。例如,展示产品列表的方法可能如下所示: ```csharp public class ProductsController : Controller { private readonly ApplicationDbContext _context; public ProductsController(ApplicationDbContext context) { _context = context; } public async Task<IActionResult> Index() { var products = await _context.Products.ToListAsync(); return View(products); } } ``` ##### 5. 视图设计 为控制器的操作方法生成对应的视图文件,通常可以通过 Scaffold 功能快速完成。 --- #### 四、高级功能 除了基本的数据访问外,还可以探索以下特性: - **原生 SQL 查询** 当 LINQ 不足以满足复杂查询需求时,可以直接执行原始 SQL: ```csharp var result = _context.Products.FromSqlRaw("SELECT * FROM Products WHERE Price > {0}", 10).ToList(); ``` - **事务处理** 确保多个操作作为一个整体成功或失败: ```csharp using (var transaction = _context.Database.BeginTransaction()) { try { // 执行一系列更新/插入操作... _context.SaveChanges(); transaction.Commit(); } catch { transaction.Rollback(); throw; } } ``` - **异步编程** 推荐始终采用异步方式调用数据库操作以提高应用响应能力[^1]。 --- #### 五、总结 本文介绍了如何利用 ASP.NET Core MVC 结合 EF Core 来开发具备高效数据访问能力的应用程序。借助于最新的 .NET 8.0 版本及其优化后的运行时表现,能够进一步增强系统的吞吐率和稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值