第三章 .NET 技术栈与环境准备
其实.net的环境搭建比较简单只需要下载对相对的版本和包就行了,没有nodejs这么多要设置的地方.
3.1 我们为何选择 .NET
3.1.1 .NET平台演进:从.NET Framework到.NET
.NET的演进历程可以说是微软拥抱开源和跨平台的缩影。
.NET Framework(传统时代)
- 发布时间:2002年,那个ASP.NET Web Forms还盛行的年代
- 特点:深度集成Windows生态,CLR+BCL的经典组合
- 局限性:Windows绑定,闭源,更新周期长
- 现状:维护模式,新项目不建议使用
.NET Core(跨平台革命)
- 发布时间:2016年,微软的惊鸿一瞥
- 特点:模块化设计,真正的跨平台支持
- 里程碑:.NET Core 3.1成为众多企业的首选LTS版本
.NET(统一平台)
- 发布时间:从.NET 5.0开始,微软完成了大一统
- 目标:一个平台,统治所有应用场景
- 版本策略:每年一个新版本,每两年一个LTS版本
从 .NET Framework 到 .NET Core:最早的项目紧紧绑在 Windows 上,部署一次就像搬家。Core 出现后,我第一次在 Linux 服务器上跑起了 ASP.NET Core,性能翻了一倍,部署脚本也终于写成了一行。
统一后的 .NET 版本线:从 .NET 5 开始,微软把 Framework 与 Core 的差异收拢。现在的基本操作是:生产线用 LTS(例如 .NET 8),预研用最新 Current 版,遇到 Breaking Change 先在预研环境踩坑。
生态系统的成熟:NuGet 包的活跃度是我们判断技术成熟度的指标之一。与 Java 社区相比,.NET 的包管理稍显克制,但常用库稳定、文档齐全,升级节奏可控。
graph LR A[传统 .NET Framework] -->|迁移压力| B[.NET Core 1~3] B -->|性能提升| C[.NET 5 统一平台] C -->|LTS 节奏| D[.NET 6 / .NET 8] C -->|快速试水| E[.NET 7 / .NET 9] style A fill:#f7f4ea,stroke:#a58b5c style B fill:#e8f4ff,stroke:#4a90e2 style C fill:#eaf7f0,stroke:#3fa46a style D fill:#d7f0d8,stroke:#327c45 style E fill:#fdf0d5,stroke:#d18f1f3.1.2 C#语言特性与优势
C#是我最钟爱的语言之一,它就像一瓶陈年红酒,越品越香。从最初的1.0到现在的12.0,每一次版本更新都带来惊喜。
为什么我喜欢C#:
- 现代与成熟并存:既有新语言的活力,又有老牌语言的稳重
- 面向对象+函数式:完美的编程范式融合
- 类型安全:编译时就能发现大部分问题
- 性能卓越:JIT编译器和GC的性能优化让人印象深刻
- 异步编程:async/await让异步代码像同步一样优雅
实战中常用的现代特性:
记录类型(Records)
在DDD中,值对象和DTO的定义变得异常简单:- // 定义一个不可变的值对象
- public record ProductId(Guid Value);
- public record Money(decimal Amount, string Currency);
- // 定义DTO
- public record CreateProductRequest(string Name, string Description, Money Price);
- public record ProductDto(Guid Id, string Name, string Description, Money Price);
- // 使用示例
- var productId = new ProductId(Guid.NewGuid());
- var price = new Money(99.99m, "USD");
- var request = new CreateProductRequest("MacBook Pro", "Apple's flagship laptop", price);
- // 非破坏性修改
- var updatedRequest = request with { Description = "Apple's premium laptop" };
复制代码 模式匹配
让复杂的条件逻辑变得清晰:- public class DiscountService
- {
- public decimal CalculateDiscount(Product product, Customer customer) => (product, customer) switch
- {
- // 高价值商品 + VIP客户
- ({ Price: > 1000 }, { IsVip: true }) => 0.2m,
-
- // 高价值商品
- ({ Price: > 1000 }, _) => 0.1m,
-
- // VIP客户
- (_, { IsVip: true }) => 0.15m,
-
- // 新品
- ({ IsNew: true }, _) => 0.05m,
-
- // 默认情况
- _ => 0m
- };
- }
复制代码 全局using指令
减少样板代码:- // GlobalUsings.cs
- global using System;
- global using System.Collections.Generic;
- global using System.Linq;
- global using System.Threading.Tasks;
- global using Microsoft.Extensions.Logging;
- // 项目文件中的配置
- <ItemGroup>
- <Using Include="Microsoft.AspNetCore.Mvc" />
- <Using Include="Microsoft.EntityFrameworkCore" />
- </ItemGroup>
复制代码 3.1.3 ASP.NET Core:微服务架构的利器
ASP.NET Core是我构建微服务的首选框架。它就像瑞士军刀,功能强大且设计精良。
核心优势:
- 跨平台部署:Windows、Linux、macOS通吃
- 性能怪兽:TechEmpower基准测试中常年霸榜
- 模块化设计:按需引用,避免不必要的开销
- 内置依赖注入:开箱即用,告别第三方容器
- 中间件管道:请求处理流程清晰可控
实际项目中的配置示例:- // Program.cs - .NET 6+的简化配置
- var builder = WebApplication.CreateBuilder(args);
- // 配置服务
- builder.Services.AddControllers();
- builder.Services.AddEndpointsApiExplorer();
- builder.Services.AddSwaggerGen(c =>
- {
- c.SwaggerDoc("v1", new() { Title = "Product API", Version = "v1" });
- });
- // 配置DbContext
- builder.Services.AddDbContext<ProductDbContext>(options =>
- options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
- // 注册应用服务
- builder.Services.AddScoped<IProductRepository, ProductRepository>();
- builder.Services.AddScoped<IProductService, ProductService>();
- // 配置AutoMapper
- builder.Services.AddAutoMapper(typeof(Program));
- // 配置HttpClient
- builder.Services.AddHttpClient<IInventoryService, InventoryService>(client =>
- {
- client.BaseAddress = new Uri(builder.Configuration["Services:Inventory"]);
- });
- var app = builder.Build();
- // 配置请求管道
- if (app.Environment.IsDevelopment())
- {
- app.UseSwagger();
- app.UseSwaggerUI();
- }
- app.UseHttpsRedirection();
- app.UseAuthorization();
- app.MapControllers();
- app.Run();
复制代码 控制器实现:- [ApiController]
- [Route("api/[controller]")]
- public class ProductsController : ControllerBase
- {
- private readonly IProductService _productService;
- private readonly IMapper _mapper;
- private readonly ILogger<ProductsController> _logger;
- public ProductsController(
- IProductService productService,
- IMapper mapper,
- ILogger<ProductsController> logger)
- {
- _productService = productService;
- _mapper = mapper;
- _logger = logger;
- }
- [HttpGet("{id}")]
- public async Task> GetById(Guid id)
- {
- try
- {
- var product = await _productService.GetByIdAsync(id);
- if (product == null)
- return NotFound();
- return Ok(_mapper.Map<ProductDto>(product));
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "Error getting product {ProductId}", id);
- return StatusCode(500, "Internal server error");
- }
- }
- [HttpPost]
- public async Task> Create(CreateProductRequest request)
- {
- try
- {
- var product = await _productService.CreateAsync(request);
- var productDto = _mapper.Map<ProductDto>(product);
-
- return CreatedAtAction(
- nameof(GetById),
- new { id = product.Id },
- productDto);
- }
- catch (ValidationException ex)
- {
- return BadRequest(ex.Message);
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "Error creating product");
- return StatusCode(500, "Internal server error");
- }
- }
- }
复制代码 3.1.4 开发环境配置
推荐的开发工具:
- Visual Studio 2022:调试体验无敌,适合偏 Windows 的用户,最近出了vs2026 的预览版,可以用来试试,还行就是界面有点像rider了。。
- Rider:跨平台一致,Git 工具顺手。
- VS Code + OmniSharp:轻量但需要精心配置插件,个人不建议这么用,如果你用ai+vscode 的话随意。
- dotnet CLI 套件:dotnet new, dotnet restore, dotnet build 是日常三件套;dotnet watch 是本地调试的提速利器,据我所知基本没人用命令开发吧,除非你用的命令行系统那当我没说。
小贴士:团队约定“任何命令都要能在 dotnet --list-sdks 中的最低版本跑通”,否则 CI 会第一时间把问题暴露出来。
3.1.5 操作系统与运行时
- 操作系统选择:开发机我主要用的还是Windows。部署的话一般用WinServer的IIS 、PM2, Linux 正常直接部署或者用 Docker、podman ,本人没有mac,不知道mac有没有什么问题
- SDK 管理:都是直接下载基本没有过锁死版本的体验,理论上来说都是要用 .config/dotnet-tools.json 与 .global.json 一并提交,锁死版本,防止出现版本冲突的,但是正常开发嘛有没有什么要求,懂得都懂。
项目结构建议:- src/
- ├── ProductService/ # 产品服务
- ├── OrderService/ # 订单服务
- ├── InventoryService/ # 库存服务
- ├── Shared/ # 共享库
- │ ├── Common/ # 通用工具
- │ ├── Events/ # 集成事件
- │ └── Models/ # 共享模型
- tests/
- ├── ProductService.Tests/
- ├── OrderService.Tests/
- └── IntegrationTests/
- docker-compose.yml
- Directory.Build.props # MSBuild属性
- NuGet.config # NuGet配置
复制代码 NuGet包管理:- <Project>
- <PropertyGroup>
- <TargetFramework>net8.0</TargetFramework>
- <ImplicitUsings>enable</ImplicitUsings>
- <Nullable>enable</Nullable>
- <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
- </PropertyGroup>
- <ItemGroup>
- <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
- <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
- <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
- <PackageReference Include="FluentValidation.AspNetCore" Version="11.3.0" />
- </ItemGroup>
- </Project>
复制代码 小结
环境准备不仅仅是“装一堆软件”,它是一次团队共同语言的对齐,但对于大部分开发者来说就是装一堆软件,除非公司要求版本控制比较严格。
团队常用的 .NET 环境拓扑 开发者电脑 Windows / macOS Visual Studio / Rider dotnet SDK 8.0 LTS 预研测试环境 Docker Compose SQL Server / PostgreSQL 集成 Serilog + Seq 生产 Kubernetes Azure AKS / 阿里云 ACK 蓝绿发布 + 金丝雀 集中日志与追踪 统一工具链 dotnet tool restore · dotnet workload restore · git hooks 所有脚本在 CI 中复用,确保“在任何机器上都能一键跑通”。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |