▲ 点击上方“DotNet NB”关注公众号
回复“1”获取开发者路线图
学习分享 丨作者 / 郑 子 铭
这是DotNet NB 公众号的第180篇原创文章
目录
设计原则
设计模式
设计原则
DRY (Don't repeat yourself 不要重复)
KISS (Keep it stupid simple 简单到傻子都能看懂)
YAGNI (You Aren't Gonna Need It 你不会需要它的)
CCP 共同闭包
CRP 共同复用
高内聚、低耦合
惯例优先配置
SCO 关注点分离
ADP 无依赖环
SOLID 面向对象设计原则
SOLID
S - Single-responsiblity Principle 单一职责
O - Open-closed Principle 对修改关闭,对扩展开放
L - Liskov Substitution Principle 里氏替换
I - Interface Segregation Principle 接口隔离
D - Dependency Inversion Principle 依赖反转
设计模式
模式通常是指那些在一些相同的领域和上下文内,解决同样的问题。所以一定要结合具体的使用场景去了解设计模式
使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性
设计模式主要分为三种类型:创建型,结构型,行为型
创建型模式关注点是如何创建对象,其核心思想是要把对象的创建和使用相分离,这样使得两者能相对对立地变换
结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过组合与运行期的动态组合来实现更灵活的功能
行为型模式主要涉及算法和对象间的职责分配。通过使用对象组合,行为型模式可以描述一组对象应该如何协作来完成一个整体任务
类型 | 模式 |
---|---|
创建型 | 工厂方法:Factory Method;抽象工厂:Abstract Factory;建造者:Builder;原型:Prototype;单例:Singleton |
结构型 | 适配器;桥接;组合;装饰器;外观;享元;代理 |
行为型 | 责任链;命令;解释器;迭代器;中介;备忘录;观察者;状态;策略;模板方法;访问者 |
工厂方法:Kestrel Server 从网络监听
意图:定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中
何时使用:有多种类型需要根据特定的场景进行创建实例时(或单个对象的创建过程比较复杂时)
外观模式:Kestrel Server 到请求执行调度
为子系统中的一组接口提供一个一致的界面。Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
符合单一职责原则,不要将过多的逻辑封装在 TransportManager 类中
KISS 原则,KEEP IT Stupid Simple
源码
https://github.com/dotnet/aspnetcore/
目录 Microsoft.AspNetCore.Server.Kestrel.Core 下面的 KestrelServerImpl 类中有一个绑定方法
options.EndPoint = await _transportManager.BindAsync(options.EndPoint, connectionDelegate, options.EndpointConfig, onBindCancellationToken).ConfigureAwait(false);
这个方法是通过 TransportManager 实现的,它是 Facade 模式,所以直接用了一个类来实现
在 TransportManager 的 StartAcceptLoop 方法中实现了绑定的功能,其实就是调用了其他的几个类
private void StartAcceptLoop<T>(IConnectionListener<T> connectionListener, Func<T, Task> connectionDelegate, EndpointConfig? endpointConfig) where T : BaseConnectionContext
{
var transportConnectionManager = new TransportConnectionManager(_serviceContext.ConnectionManager);
var connectionDispatcher = new ConnectionDispatcher<T>(_serviceContext, connectionDelegate, transportConnectionManager);
var acceptLoopTask = connectionDispatcher.StartAcceptingConnections(connectionListener);
_transports.Add(new ActiveTransport(connectionListener, acceptLoopTask, transportConnectionManager, endpointConfig));
}
在 TransportManager 的绑定方法中使用了 _transportFactory,它就是 IConnectionListenerFactory
var transport = await _transportFactory.BindAsync(endPoint, cancellationToken).ConfigureAwait(false);
IConnectionListenerFactory 转到实现可以看到 SocketTransportFactory,它在 Transport.Sockets 中
除了 SocketTransportFactory,还有 QuicTransportFactory,它是 HTTP/3 协议的监听器
多种实现最后都由 TransportManager 进行统一的管理
工厂方法符合开闭原则,后期有新的类型的时候,只需要添加新的类型和对应的工厂即可。不需要对代码逻辑进行修改
课程链接
推荐阅读:
《Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记》