为什么 C# 不仅仅是一门语言,更是一个完整的工具宇宙
当开发者刚开始深入 .NET 世界时,他常常会想:“C# 很酷,但我现在能做什么?”答案很简单:使用库。C# 生态系统如此丰富,以至于有时感觉任何任务在 NuGet 上都有现成的解决方案。这很棒,因为热门 C# 库让你无需重复造轮子,而是专注于业务逻辑。
在本文中,我们将解析每个开发者真正需要的 .NET 库生态系统。我们不会仅仅列举名称——我会展示代码示例,说明在何处使用它们,并给出实用建议。开始吧!
日志记录:Serilog vs NLog——巨人之战
日志记录是首先要考虑的事情。没有日志,你就如同盲人。Serilog 库已成为 .NET 世界的事实标准。为什么?因为它能将日志发送到任何地方:文件、控制台、Elasticsearch、数据库。而且这一切只需最少的配置。
示例:在 ASP.NET Core 中配置 Serilog
using Serilog;
Log.Logger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.File("logs/myapp-.txt", rollingInterval: RollingInterval.Day) .CreateLogger();
var builder = WebApplication.CreateBuilder(args);builder.Host.UseSerilog();
var app = builder.Build();app.MapGet("/", () => "Hello World!");app.Run();NLog 也是一个强大的工具,但它需要更多的 XML 配置。如果你想要简单快捷,选择 Serilog。如果你需要完全控制,选择 NLog。但对于 90% 的项目,Serilog 是最佳选择。
Entity Framework Core:无需畏惧的 ORM
数据库操作是每个开发者的痛点。用于数据库操作的 C# 库分为两大阵营:重量级 ORM(Entity Framework)和轻量级 ORM(Dapper)。Entity Framework Core (EF Core) 是一个强大的工具,它能为你生成 SQL。它非常适合复杂的领域模型。
示例:使用 EF Core 进行简单的 CRUD 操作
public class User{ public int Id { get; set; } public string Name { get; set; }}
public class AppDbContext : DbContext{ public DbSet<User> Users { get; set; }}
// 使用using var db = new AppDbContext();var user = new User { Name = "阿列克谢" };db.Users.Add(user);db.SaveChanges();但有一个问题:EF Core 在处理复杂查询时可能较慢。对于高负载系统,最好使用 Dapper——一种微 ORM,它运行速度快得多,但需要手动编写 SQL。
何时选择 Dapper?
- 需要最高性能
- 查询简单(无复杂逻辑的 CRUD)
- 不畏惧 SQL
using var connection = new SqlConnection(connectionString);var users = connection.Query<User>("SELECT * FROM Users WHERE IsActive = @Active", new { Active = true });AutoMapper:无痛映射
如果你用 C# 编程,你会经常遇到将一个对象转换为另一个对象的情况。DTO → Entity,Entity → ViewModel。手动映射既枯燥又容易出错。AutoMapper 能自动化这个过程。
示例:配置映射配置文件
public class UserProfile : Profile{ public UserProfile() { CreateMap<User, UserDto>() .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}")); }}
// 使用var config = new MapperConfiguration(cfg => cfg.AddProfile<UserProfile>());var mapper = config.CreateMapper();var dto = mapper.Map<UserDto>(user);建议:不要过度使用 AutoMapper。如果映射过于