.NET微服务之环境准备
第三章 .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 的包管理稍显克制,但常用库稳定、文档齐全,升级节奏可控。
3.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<ActionResult<ProductDto>> 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<ActionResult<ProductDto>> 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包管理:
<!-- Directory.Build.props -->
<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>
小结
环境准备不仅仅是“装一堆软件”,它是一次团队共同语言的对齐,但对于大部分开发者来说就是装一堆软件,除非公司要求版本控制比较严格。

浙公网安备 33010602011771号