网易首页 > 网易号 > 正文 申请入驻

告别9种过时设计模式!掌握.NET 10与C

0
分享至

曾几何时,某些设计模式是 .NET 优秀架构的基石。我们为 DbContext 包装仓储层,为缓存构建装饰器,精心设计线程安全的单例类。这些模式确实解决过问题——至少在当年如此。

但 .NET 已颠覆游戏规则。随着高级依赖注入、源生成器、Minimal API 和 C#12 新特性的到来,许多经典模式悄然过时。并非它们有错,而是 .NET 已替你处理了这些关切。

1. 仓储层 + 工作单元

传统模式

public interface IRepository  // 冗余抽象Task GetByIdAsync(int id);void Add(T entity);void Remove(T entity);public interface IUnitOfWork  // 重复造轮子Task CommitAsync();}

过时原因
EF Core 已通过 DbSet 暴露仓储逻辑,并通过 SaveChangesAsync 管理工作单元。自定义包装器增加无意义抽象层。

现代方案

public class ProductService(MyContext _db)  // 直接注入DbContextpublic Task GetByIdAsync(int id) =>_db.Products.FindAsync(id).AsTask();public async Task AddProduct(Product product!)_db.Products.Add(product);await _db.SaveChangesAsync();  // 原生工作单元}

结合 C#12 必需成员与空检查:

public record Productpublic required string Name { get; init; }  // 编译时安全}
2. 服务定位器

反例

var logger = ServiceLocator.Get();  // 隐藏依赖

过时原因
静态访问使依赖不可见,测试如同噩梦。

现代方案

// Minimal API 显式注入app.MapGet("/log", (ILogger logger) =>logger.LogInformation("优雅的日志记录"));// 构造函数注入public class AuthService(ILogger _logger)public void Authenticate() =>_logger.LogInformation("用户认证中...");}
3. 日志包装器

传统写法

public class LoggerHelper  // 手工包装器private readonly ILogger _logger;public void LogFailedLogin(string userId) =>_logger.LogWarning($"登录失败: {userId}");  // 字符串拼接低效}

现代方案

public static partial class AuthLog  // 源生成器[LoggerMessage(EventId = 101, Level = LogLevel.Warning,Message = "用户 {UserId} 登录失败")]public static partial void FailedLogin(ILogger logger, string userId);// 调用:零分配开销AuthLog.FailedLogin(_logger, userId);
4. 工厂方法模式

过时实现

public class WidgetFactory : IWidgetFactory  // 简单场景的过度设计public Widget Create() => new Widget();}

现代替代

// 依赖注入容器自动构造builder.Services.AddTransient();// 需额外参数时var widget = ActivatorUtilities.CreateInstance(provider, arg1, arg2);
5. 横切关注点装饰器

传统做法

public class CachingRepository : IRepository  // 业务逻辑污染private readonly IRepository _inner;public async Task Get(int id)// 缓存逻辑与业务耦合return await _inner.Get(id);}

现代方案

// 中间件统一处理app.UseResponseCaching();app.MapGet("/products", async (MyContext db) =>await db.Products.ToListAsync()).CacheResponse(60);  // 声明式缓存
6. 适配器模式

过时实现

public class LegacyAdapter : INewApi  // 冗余包装类private readonly LegacyService _legacy;public Data Get() => Convert(_legacy.Fetch());}

现代替代

public static class LegacyExtensions  // 扩展方法直接适配public static Data ToNewData(this LegacyService svc) =>new Data(svc.Fetch().Value);// 调用:legacyService.ToNewData()
7. 手动单例模式

传统写法

public sealed class Logger  // 线程安全手工实现private static readonly Lazy _instance = new(...);public static Logger Instance => _instance.Value;}

现代方案

// 容器托管生命周期builder.Services.AddSingleton();  // 自动处理线程安全
8. 手工 DTO 映射

过时做法

public static OrderDto Map(Order order) =>  // 手工赋值new OrderDto { Id = order.Id, Total = order.Total };

现代方案

// C#记录类型简化public record OrderDto(int Id, decimal Total);// 一行完成映射var dto = new OrderDto(order.Id, order.Total);
9. 共享引用与深层命名空间

传统风格

namespace MyApp.Features.Submodule.Core;  // 冗长嵌套

现代优化

// GlobalUsings.csglobal using System.Text.Json;global using Microsoft.Extensions.Logging;// 文件顶部简化namespace MyApp.Features;  // 文件作用域命名空间
过时模式与现代替代对照表

过时模式✅ .NET 10 替代方案仓储层+工作单元直接使用 DbContext服务定位器构造函数/Minimal API 注入日志包装器源生成器 [LoggerMessage]工厂模式DI 容器 / ActivatorUtilities装饰器中间件/端点过滤器适配器扩展方法手动单例AddSingleton() 注册手工 DTO 映射C# 记录类型深层命名空间文件作用域命名空间

重构行动指南

放手依赖多年的模式或许不适——但随着 .NET 进化,这些模式常成为冗余脚手架。

三步重构法
1️⃣从小处开始

  • • 将单个仓储替换为直接 DbContext 调用
  • • 用源生成日志替换一个包装器

2️⃣转移横切逻辑

  • • 将装饰器功能迁移到中间件层

3️⃣体验收益

  • • 代码可读性提升 40%+
  • • 变更速度提高 2 倍
  • • 调试时间减少 60%

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
生育机器?白百何疑怀三胎!短发平底鞋现身,小腹隆起孕味藏不住

生育机器?白百何疑怀三胎!短发平底鞋现身,小腹隆起孕味藏不住

八卦王者
2026-01-26 15:20:02
张不开嘴就别尬演!黄晓明“吃泡面”,戳穿了多少演员最后的体面

张不开嘴就别尬演!黄晓明“吃泡面”,戳穿了多少演员最后的体面

十里电影
2026-01-18 10:07:37
100多位情妇,包养费上亿元,9女同床却落得个凄凉下场、人财两空

100多位情妇,包养费上亿元,9女同床却落得个凄凉下场、人财两空

伴史缘
2026-01-26 12:05:21
中科大连夜宣布好消息!全世界都没想到,芯片还能自己长出来?

中科大连夜宣布好消息!全世界都没想到,芯片还能自己长出来?

鲸探所长
2026-01-26 11:43:05
闫学晶风波终于收场,6个男人惨遭牵扯,儿媳与继女不好过

闫学晶风波终于收场,6个男人惨遭牵扯,儿媳与继女不好过

乡野小珥
2026-01-26 12:39:45
洗车行业拒绝电车,害怕洗电车会破产,与防水造假有关?

洗车行业拒绝电车,害怕洗电车会破产,与防水造假有关?

柏铭锐谈
2026-01-25 13:11:40
陈汉典和Lulu大婚,二人婚礼现场哭成泪人,Lulu爸开出租车送女儿

陈汉典和Lulu大婚,二人婚礼现场哭成泪人,Lulu爸开出租车送女儿

乐悠悠娱乐
2026-01-26 12:40:21
2026,沉默,沉默,沉默

2026,沉默,沉默,沉默

洞读君
2026-01-21 16:07:26
36万亿美债压顶,中国拒不接盘!特朗普决定“弄死”大债主!

36万亿美债压顶,中国拒不接盘!特朗普决定“弄死”大债主!

毒sir财经
2025-10-12 20:07:17
53岁内蒙古货车司机在罗布泊突发心梗去世,热心卡友赶赴当地耗时三天两夜将车开出无人区,将接力帮忙将货送到目的地

53岁内蒙古货车司机在罗布泊突发心梗去世,热心卡友赶赴当地耗时三天两夜将车开出无人区,将接力帮忙将货送到目的地

极目新闻
2026-01-26 15:22:32
大V曝李湘因洗钱遭禁言!与黄有龙交集被扒,王诗龄的画成证据!

大V曝李湘因洗钱遭禁言!与黄有龙交集被扒,王诗龄的画成证据!

古希腊掌管月桂的神
2026-01-25 18:31:59
低位淘宝大获成功!勇士后场新秀的作用绝对是远超预期了?

低位淘宝大获成功!勇士后场新秀的作用绝对是远超预期了?

稻谷与小麦
2026-01-26 15:24:54
突发!制片人姜莹莹被移送公安机关,2026开年影视圈反腐第一锤

突发!制片人姜莹莹被移送公安机关,2026开年影视圈反腐第一锤

喜欢历史的阿繁
2026-01-26 15:19:58
特斯拉再次变相降价!

特斯拉再次变相降价!

电动知家
2026-01-25 11:14:56
爆冷!第87分钟绝杀,英超领头羊轰然倒下,阿尔特塔不敢相信

爆冷!第87分钟绝杀,英超领头羊轰然倒下,阿尔特塔不敢相信

足球狗说
2026-01-26 02:26:00
他的朝代只有23年,子孙却几乎被杀光

他的朝代只有23年,子孙却几乎被杀光

最爱历史
2026-01-25 13:37:54
被核武轰炸45次,罗布泊本该寸草不生,结果却成世界最大钾肥基地

被核武轰炸45次,罗布泊本该寸草不生,结果却成世界最大钾肥基地

鉴史录
2026-01-23 12:12:32
明日腊八节是“凶日”,提醒:1不说,2不去,3不吃,不忘传统

明日腊八节是“凶日”,提醒:1不说,2不去,3不吃,不忘传统

小谈食刻美食
2026-01-25 11:30:19
太空光伏概念大幅高开 明阳智能等多股涨停

太空光伏概念大幅高开 明阳智能等多股涨停

每日经济新闻
2026-01-26 09:38:43
长得漂亮却坏事做尽,3次入狱,被摘除4处器官的她,如今过得怎样

长得漂亮却坏事做尽,3次入狱,被摘除4处器官的她,如今过得怎样

银河史记
2026-01-23 15:36:04
2026-01-26 16:12:49
冒泡泡的鱼儿
冒泡泡的鱼儿
每天带来社会资讯
374文章数 15034关注度
往期回顾 全部

科技要闻

印奇再上牌桌,阶跃融资50亿

头条要闻

高市早苗:若执政党阵营在选举中未过半数 将即刻辞职

头条要闻

高市早苗:若执政党阵营在选举中未过半数 将即刻辞职

体育要闻

叛逆的大公子,要砸了贝克汉姆这块招牌

娱乐要闻

张雨绮被实名举报代孕、插足婚姻

财经要闻

从美式斩杀线看中国社会的制度韧性构建

汽车要闻

宾利第四台Batur敞篷版发布 解锁四项定制创新

态度原创

教育
艺术
手机
时尚
家居

教育要闻

a+b=5,ab=3,求3次方

艺术要闻

溥心畬的花鸟,淡雅清新

手机要闻

消息称小米REDMI Turbo 5 Max手机配粮系今年上半年的最大电池

伊姐周日热推:电视剧《太平年》;电视剧《暗恋者的救赎》......

家居要闻

流韵雅居,让复杂变纯粹

无障碍浏览 进入关怀版