Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.NET 9时代革新:四大传统设计模式已成过去式!

.NET 9时代革新:四大传统设计模式已成过去式!

作者头像
郑子铭
发布于 2025-06-20 01:15:38
发布于 2025-06-20 01:15:38
6900
代码可运行
举报
运行总次数:0
代码可运行

框架进化论

伴随每个新版本.NET的发布,微软都在用内置功能重塑软件开发范式。.NET 9延续这一传统,通过强化依赖注入、事件处理、中间件和Entity Framework Core等核心模块,让诸多经典设计模式失去了用武之地。

本文将深度解析这些被.NET 9"淘汰"的设计模式,揭示其背后技术演进的底层逻辑:

  1. 1. 单例模式 → 内置依赖注入
  2. 2. 工厂模式 → 服务容器与依赖注入
  3. 3. 观察者模式 → .NET事件系统与Reactive扩展
  4. 4. 仓储模式 → EF Core 8直接实现

1. 单例模式 → 依赖注入容器

为何曾经需要单例模式?

作为经典设计模式之首,单例模式通过强制唯一实例解决全局资源管理问题。典型应用场景包括: • 缓存管理 • 日志记录 • 配置中心数据库连接池

传统手动实现存在三大痛点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public classSingletonService
{
    privatestatic SingletonService? _instance;
    privatestaticreadonlyobject _lock = newobject();

    private SingletonService() { }
    
    publicstatic SingletonService Instance
    {
        get
        {
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = new SingletonService();
                }
                return _instance;
            }
        }
    }
    
    public void DoSomething()
    {
        Console.WriteLine("单例方法调用");
    }
}

致命缺陷分析: • 线程安全依赖显式锁机制 • 生命周期管理完全手动化 • 单元测试时难以重置状态

现代方案:依赖注入革命

.NET 9内置容器原生支持单例生命周期:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 服务注册
builder.Services.AddSingleton<SingletonService>();

// 服务消费
publicclassMyComponent
{
    privatereadonly SingletonService _service;

    public MyComponent(SingletonService service)
    {
        _service = service;
    }
    
    public void Execute() => _service.DoSomething();
}

技术红利: • 容器自动保证线程安全 • 实现真正的按需延迟初始化 • 支持模拟对象进行单元测试


2. 工厂模式 → 依赖注入与服务定位

传统工厂模式的困境

工厂模式用于封装对象创建逻辑,但存在致命缺陷:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interfaceICar { void Drive(); }

publicclassBMW : ICar { public void Drive()=>Console.WriteLine("BMW驾驶体验"); }

publicstaticclassCarFactory
{
    public static ICar Create(string type) => 
        type switch { "BMW" => new BMW(), _ => thrownew ArgumentException() };
}

违背开闭原则的代价: • 新增车型必须修改工厂类 • 工厂方法膨胀导致维护困难 • 依赖关系隐式耦合

依赖注入新范式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 服务注册
builder.Services.AddTransient<ICar, BMW>();

// 服务消费
public class CarService
{
    private readonly ICar _car;

    public CarService(ICar car) => _car = car;

    public void Start() => _car.Drive();
}

架构优势: • 0代码侵入实现多态扩展 • 依赖关系显式声明 • 测试时可直接注入Mock对象


3. 观察者模式 → 事件系统与响应式编程

传统观察者实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IObserver { void Update(string message); }

public class Publisher
{
    private List<IObserver> _observers = new();
    
    public void Subscribe(IObserver observer) => _observers.Add(observer);
    
    public void NotifyAll(string msg) => 
        _observers.ForEach(o => o.Update(msg));
}

隐藏的技术债务: • 手动维护订阅者列表 • 内存泄漏风险(未正确取消订阅) • 通知顺序无法控制

.NET原生解决方案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public classEventPublisher
{
    // 定义强类型事件
    publicevent EventHandler<string>? OnDataChanged;
    
    public void PublishChange(string data) =>
        OnDataChanged?.Invoke(this, data);
}

publicclassSubscriber
{
    public Subscriber(EventPublisher publisher) =>
        publisher.OnDataChanged += (s, e) => 
            Console.WriteLine($"收到更新:{e}");
}

关键技术突破: • 编译时类型安全保障 • 自动内存管理(+=/-=语法) • 支持异步事件处理


4. 仓储模式 → EF Core 8直接实现

仓储模式的兴衰史

传统仓储层设计:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interfaceIUserRepo
{
    Task<User> GetByIdAsync(int id);
    Task AddAsync(User user);
}

publicclassUserRepo : IUserRepo
{
    privatereadonly AppDbContext _context;
    
    public UserRepo(AppDbContext context) => _context = context;
    
    public async Task<User> GetByIdAsync(int id) =>
        await _context.Users.FindAsync(id);
}

过度抽象的代价: • 增加无谓的抽象层次 • 需要额外维护接口与实现 • 抵消了EF Core的优势特性

EF Core 8实战

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserService
{
    private readonly AppDbContext _context;

    public UserService(AppDbContext context) => _context = context;

    public async Task<List<User>> GetAll() => 
        await _context.Users.ToListAsync();

    public async Task Add(User user) =>
        await _context.Users.AddAsync(user);
}

性能飞跃的关键: • 直接利用DbContext的变更追踪 • 内置延迟加载与批处理 • 减少一次内存分配层级

单元测试新范式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var options = new DbContextOptionsBuilder<AppDbContext>()
    .UseInMemoryDatabase(databaseName: "TestDb")
    .Options;

using var context = new AppDbContext(options);
var service = new UserService(context);

// 直接操作内存数据库完成测试
await service.Add(new User());
var count = await service.GetAll().CountAsync();

拥抱框架进化论

.NET 9的发展轨迹清晰展现一个趋势:框架能力边界不断拓展,迫使开发者从重复造轮子转向业务价值创造。当您还在纠结如何实现线程安全的单例时,框架早已提供经过充分优化的解决方案;当您试图编写通用仓储接口时,EF Core 8已经将数据访问简化到极致。

这些技术演进不是要否定设计模式的经典价值,而是提醒我们:优秀架构师应该像园丁修剪枝杈那样,去除冗余设计,让框架的能力自然流淌在代码之中。在.NET 9时代,明智的选择是深入理解框架特性,而非固守过时的设计模式教条。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图解常见的九种设计模式
在软件工程中,设计模式(Design Pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。根据模式的目的来划分的话,GoF(Gang of Four)设计模式可以分为以下 3 种类型:
前端森林
2020/11/03
1.6K0
图解常见的九种设计模式
Java常用设计模式
​ Java包含23种设计模式,是一套对代码设计经验的总结,被人们反复利用,多人熟知的代码设计方式。
全栈程序员站长
2022/09/08
3040
Java常用设计模式
每个 C# 开发人员都应该掌握的 5 种强大的设计模式
想象一下你正在建造一栋房子。你是更愿意使用来自专业建筑师那些经过实践检验的蓝图呢,还是从头开始绘制所有的设计图呢?软件开发也是同样的道理!设计模式是针对常见问题的经实践验证的解决方案,它们提供了清晰的蓝图,能让你的代码更高效、更可复用且更易于维护。
郑子铭
2025/02/20
1830
每个 C# 开发人员都应该掌握的 5 种强大的设计模式
.NET 中的设计模式应用
设计模式是软件设计与开发过程中常见问题的可复用解决方案。它们是通用模板或最佳实践,用于指导开发人员创建结构良好、可维护且高效的代码。
郑子铭
2025/02/18
730
.NET 中的设计模式应用
依赖注入[2]: 基于IoC的设计模式
正如我们在《控制反转》提到过的,很多人将IoC理解为一种“面向对象的设计模式”,实际上IoC自身不仅与面向对象没有必然的联系,它也算不上是一种设计模式。一般来讲,设计模式提供了一种解决某种具体问题的方案,但是IoC既没有一个针对性的问题领域,其自身没有提供一种可实施的解决方案,所以我更加倾向于将IoC视为一种设计原则。实际上很多我们熟悉的设计模式背后采用了IoC原则,接下来我们就来介绍几种典型的“设计模式”。
蒋金楠
2018/08/01
8850
工作中最常用的 8 种设计模式
设计模式在我们日常的软件开发中无处不在,它们帮助我们编写更易扩展、更具可读性的代码。
苏三说技术
2024/12/19
1910
工作中最常用的 8 种设计模式
设计模式
静态内部类实现方式(也是一种赖加载方式) public class SingletonDemo04 { private static class SingletonClassInstance { private static final SingletonDemo04 instance = new SingletonDemo04(); } public static SingletonDemo04 getInstance() { return SingletonClassInstance.instance; } private SingletonDemo04() {
海仔
2019/08/06
6600
面试 设计题_设计模式面试题及答案
察者方法 public void removeObserver(Observer obs) { list.remove(obs); }
全栈程序员站长
2022/09/30
8590
面试 设计题_设计模式面试题及答案
设计模式六大原则(三)----依赖倒置原则
依赖倒置原则(Dependence Inversion Principle, DIP), 其含义:
用户7798898
2021/06/10
2.5K0
ASP.NET Core Middleware抽丝剥茧
ASP.NET Core Middleware是在ASP.NET Core处理管道中处理特定业务逻辑的组件。
有态度的马甲
2021/01/20
6130
我常用的六种设计模式
关于设计模式,我看了很多书籍和视频,但由于部分设计模式并不常用,所以也难免有些遗忘。后来索性就用到哪个时再深入学习哪个。
程序员的园
2025/03/17
940
我常用的六种设计模式
诊断日志知多少 | DiagnosticSource 在.NET上的应用
最近为了解决ABP集成CAP时无法通过拦截器启用工作单元的问题,从小伙伴那里学了一招。借助DiagnossticSource,可以最小改动完成需求。关于DiagnosticSource晓东大佬18年在文章 在 .NET Core 中使用 Diagnostics (Diagnostic Source) 记录跟踪信息就有介绍,文章开头就说明了Diagnostics 一直是一个被大多数开发者忽视的东西。是的,我也忽略了,这个好东西,有必要学习一下,下面就和大家简单聊一聊System.Diagnostics.DiagnosticSource在.NET上的应用。
圣杰
2020/10/16
1.1K0
诊断日志知多少 | DiagnosticSource 在.NET上的应用
金三银四面试:ASP.NET Core面试题汇总
金三银四面试准备,奉上第三弹ASP.NET Core面试题汇总。先出题大家试答一下,然后再看后面的答案。希望对大家面试有所帮助。
郑子铭
2024/05/08
5170
金三银四面试:ASP.NET Core面试题汇总
Repository Pattern已死?深入剖析.NET中的设计模式争议与最佳实践
在.NET生态中,鲜有话题能像 仓储模式(Repository Pattern) 这般引发激烈争论。有些开发者奉其为整洁架构的基石,另一些人则认为它是被Entity Framework Core(EF Core)淘汰的冗余设计。
郑子铭
2025/05/17
1320
Repository Pattern已死?深入剖析.NET中的设计模式争议与最佳实践
【Java基础】23种设计模式介绍
是简单工厂模式的进一步抽象和推广,是GoF设计模式的一种,由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点
阿提说说
2022/12/02
3660
前端开发中常用的几种设计模式有哪些_设计模式原理
设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论,而不是现成的代码,当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解决的问题,毕竟这是前人无数经验总结成的最佳实践,而代码实现则是对加深理解的辅助。
全栈程序员站长
2022/11/18
1.8K0
前端开发中常用的几种设计模式有哪些_设计模式原理
Netty 中应用了哪些设计模式?
Netty 源码中运用了大量的设计模式,常见的设计模式在 Netty 源码中都有所体现。
MickyInvQ
2021/02/06
1.2K0
Netty 中应用了哪些设计模式?
Java设计模式8种
1.模板模式 2.建造者模式 3.装饰器模式 4.工厂模式 5.策略模式 6.代理模式 7.单例模式 8.观察者模式
oktokeep
2025/03/05
1930
设计模式在Java开发中的运用与实例分析
设计模式是软件开发中的重要概念,它提供了一种可复用的解决方案,帮助开发者解决常见的问题,并促进代码的灵活性和可维护性。本文将深入探讨设计模式在Java开发中的运用,并通过实例分析来演示设计模式的实际应用。
华科云商小彭
2023/09/28
3790
设计模式在Java开发中的运用与实例分析
Java设计模式解析 ---单例模式的实现
设计模式是我们日常工作中不可或缺的一部分。设计模式是一组经过验证的解决方案,用于解决在软件设计中经常遇到的问题。在本文中,我们将探讨在实际工作中用到过哪些设计模式,并详细介绍单例模式的实现。通过深入理解这些设计模式,我们可以更好地设计出可维护、可扩展和高性能的软件系统。
疯狂的KK
2023/09/22
1850
Java设计模式解析 ---单例模式的实现
相关推荐
图解常见的九种设计模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档