翱龟墓 发表于 2025-10-23 18:05:00

.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 的包管理稍显克制,但常用库稳定、文档齐全,升级节奏可控。
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();控制器实现:

")]
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;
    }

   
    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");
      }
    }

   
    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 / macOSVisual Studio / Riderdotnet SDK 8.0 LTS    预研测试环境Docker ComposeSQL Server / PostgreSQL集成 Serilog + Seq    生产 KubernetesAzure AKS / 阿里云 ACK蓝绿发布 + 金丝雀集中日志与追踪      统一工具链dotnet tool restore · dotnet workload restore · git hooks所有脚本在 CI 中复用,确保“在任何机器上都能一键跑通”。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

呵烘稿 发表于 2025-12-3 23:30:34

东西不错很实用谢谢分享
页: [1]
查看完整版本: .NET微服务之环境准备