ASP.NET Core 网站开发实例:构建高效电商平台
ASP.NET Core 是构建现代、高性能、跨平台 Web 应用的强大框架。 本文通过一个精简电商网站实例,深入解析核心开发流程与最佳实践。

环境与项目初始化
- 必备工具:
- .NET SDK (推荐 LTS 版本)
- Visual Studio / VS Code
- SQL Server / SQLite / PostgreSQL
- 创建项目:
dotnet new webapp -n MyEcommerceSite -o src/MyEcommerceSite cd src/MyEcommerceSite
- 关键包引用:
Microsoft.EntityFrameworkCore.SqlServer(数据库访问)Microsoft.EntityFrameworkCore.Design(迁移工具)Dapper(高性能数据操作 – 可选)Microsoft.AspNetCore.Identity.EntityFrameworkCore(身份认证)
分层架构设计 (核心)
采用分层架构提升可维护性与可测试性:

- 表现层 (Presentation Layer):
MyEcommerceSite(Razor Pages / MVC) - 业务逻辑层 (Business Logic Layer):
MyEcommerceSite.Core- 领域模型 (
Product,Order,Customer) - 服务接口 (
IProductService,IOrderProcessingService) - 业务规则实现 (库存检查、折扣计算)
- 领域模型 (
- 数据访问层 (Data Access Layer):
MyEcommerceSite.Infrastructure- DbContext (
AppDbContext) - 仓储接口与实现 (
IProductRepository,EfProductRepository) - 迁移管理
- DbContext (
核心功能模块实现
产品管理
- 模型定义 (
Product.cs):public class Product { public int Id { get; set; } [Required, StringLength(100)] public string Name { get; set; } [DataType(DataType.Currency)] public decimal Price { get; set; } public int StockQuantity { get; set; } public string? ImageUrl { get; set; } } - 仓储接口 (
IProductRepository.cs):public interface IProductRepository { Task<Product?> GetByIdAsync(int id); Task<List<Product>> GetFeaturedProductsAsync(int count); Task UpdateStockAsync(int productId, int quantityChange); } - EF Core 实现 (
EfProductRepository.cs):public class EfProductRepository(AppDbContext context) : IProductRepository { public async Task UpdateStockAsync(int productId, int quantityChange) { var product = await context.Products.FindAsync(productId); if (product != null) { product.StockQuantity += quantityChange; await context.SaveChangesAsync(); } } // ... 其他方法实现 } - 服务层 (
ProductService.cs):public class ProductService(IProductRepository productRepository) { public async Task<bool> PlaceOrderAsync(Order order) { // 业务逻辑:检查库存、应用折扣、创建订单 foreach (var item in order.OrderItems) { await productRepository.UpdateStockAsync(item.ProductId, -item.Quantity); } // ... 保存订单等 return true; } }
用户认证与授权
- 集成 Identity:
services.AddDbContext<AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<AppDbContext>(); - 策略授权 (示例:仅管理员管理产品):
[Authorize(Policy = "RequireAdministratorRole")] public class ProductsAdminModel : PageModel { ... }
购物车实现
- Session 或数据库存储 (根据需求选择)
- 关键操作:
public class CartService { public void AddItem(Cart cart, int productId, int quantity) { var existingItem = cart.Items.FirstOrDefault(i => i.ProductId == productId); if (existingItem != null) existingItem.Quantity += quantity; else cart.Items.Add(new CartItem { ProductId = productId, Quantity = quantity }); } public decimal CalculateTotal(Cart cart, IProductRepository repo) { // 获取产品价格计算总价 } }
性能与安全优化
- 性能:
- 缓存策略: 使用
IMemoryCache或IDistributedCache缓存首页、分类页等。 - 异步编程: Controller/Action 和 Repository 方法广泛使用
async/await。 - 查询优化: EF Core 使用
.AsNoTracking(),避免不必要的数据跟踪;使用Select投影只取所需字段。
- 缓存策略: 使用
- 安全:
- 输入验证: 模型属性使用
[Required],[StringLength],[Range]等 DataAnnotations;Controller 中检查ModelState.IsValid。 - XSS 防护: Razor 视图引擎默认编码输出;谨慎使用
@Html.Raw()。 - CSRF 防护: 表单自动包含防伪令牌 (
@Html.AntiForgeryToken()+[ValidateAntiForgeryToken])。 - SQL 注入防护: 使用 EF Core 参数化查询或 Dapper 的参数化调用。
- HTTPS 重定向:
app.UseHttpsRedirection();
- 输入验证: 模型属性使用
部署与监控
- 部署选项:
- Windows: IIS (需安装 ASP.NET Core Hosting Bundle)。
- Linux: Nginx / Apache 作为反向代理 + Kestrel。
- 容器化: 构建 Docker 镜像部署到 Kubernetes 或 Azure Container Instances。
- 云平台: Azure App Service (最简方式)。
- 配置文件:
appsettings.Production.json管理生产环境连接字符串等敏感信息。 - 监控与日志:
- 集成
Serilog或NLog记录到文件/数据库/云日志服务。 - 使用 Application Insights (Azure) 或 OpenTelemetry 进行性能监控和错误追踪。
- 集成
你的选择? 在构建下一个 ASP.NET Core 应用时,你会优先考虑 Razor Pages 的简洁高效,还是 MVC 更清晰的职责分离?对于高并发场景,是选择成熟的 Dapper,还是 EF Core 的最新性能优化?欢迎分享你的实战经验与架构思考!

原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/20242.html