框架设计
好的,下面我用**非静态**(全部用实例对象和依赖注入),结合你的业务场景,给出常见设计模式的实践建议和典型代码片段,并说明哪些地方适合用什么设计模式。
---
## 1. 单例模式(Singleton)
**实践场景**:全局唯一服务(如配置、事件总线、缓存等),用依赖注入的`AddSingleton`实现。
```csharp
public interface IAppConfig { string Get(string key); }
public class AppConfig : IAppConfig
{
public string Get(string key) => "value";
}
// 注册
services.AddSingleton<IAppConfig, AppConfig>();
```
---
## 2. 工厂方法/抽象工厂(Factory/AbstractFactory)
**实践场景**:仓储、支付、DbContext等对象的创建。
```csharp
public interface IRepositoryFactory
{
IRepository<T> Create<T>() where T : class;
}
public class RepositoryFactory : IRepositoryFactory
{
private readonly IServiceProvider _provider;
public RepositoryFactory(IServiceProvider provider) { _provider = provider; }
public IRepository<T> Create<T>() where T : class => _provider.GetRequiredService<IRepository<T>>();
}
// 注册
services.AddScoped<IRepositoryFactory, RepositoryFactory>();
```
---
## 3. 策略模式(Strategy)
**实践场景**:支付、鉴权、序列化等可切换算法。
```csharp
public interface IPaymentStrategy { void Pay(); }
public class AlipayStrategy : IPaymentStrategy { public void Pay() { /*...*/ } }
public class WeChatPayStrategy : IPaymentStrategy { public void Pay() { /*...*/ } }
public class PaymentContext
{
private readonly IPaymentStrategy _strategy;
public PaymentContext(IPaymentStrategy strategy) { _strategy = strategy; }
public void ExecutePay() => _strategy.Pay();
}
// 注册
services.AddTransient<IPaymentStrategy, AlipayStrategy>();
services.AddTransient<PaymentContext>();
```
---
## 4. 装饰器模式(Decorator)
**实践场景**:AOP、日志、缓存、权限。
```csharp
public class LoggingRepository<T> : IRepository<T>
{
private readonly IRepository<T> _inner;
public LoggingRepository(IRepository<T> inner) { _inner = inner; }
public void Add(T entity) { Console.WriteLine("日志"); _inner.Add(entity); }
}
// 注册
services.Decorate(typeof(IRepository<>), typeof(LoggingRepository<>)); // 需用Scrutor等库
```
---
## 5. 观察者模式(Observer)
**实践场景**:事件总线、领域事件。
```csharp
public interface IEventHandler<T> { void Handle(T evt); }
public class EventBus
{
private readonly IEnumerable<IEventHandler<object>> _handlers;
public EventBus(IEnumerable<IEventHandler<object>> handlers) { _handlers = handlers; }
public void Publish<T>(T evt)
{
foreach (var h in _handlers.OfType<IEventHandler<T>>()) h.Handle(evt);
}
}
// 注册
services.AddSingleton<EventBus>();
```
---
## 6. 责任链模式(Chain of Responsibility)
**实践场景**:中间件、请求处理管道。
```csharp
public interface IHandler { Task Handle(RequestContext ctx); }
public class AuthHandler : IHandler
{
private readonly IHandler _next;
public AuthHandler(IHandler next) { _next = next; }
public async Task Handle(RequestContext ctx) { /*...*/ await _next.Handle(ctx); }
}
// 注册链
services.AddTransient<IHandler, AuthHandler>();
```
---
## 7. 适配器模式(Adapter)
**实践场景**:第三方支付、缓存、消息队列等接口适配。
```csharp
public class AlipayAdapter : IPaymentStrategy
{
private readonly AlipayService _alipay;
public AlipayAdapter(AlipayService alipay) { _alipay = alipay; }
public void Pay() => _alipay.DoPay();
}
// 注册
services.AddTransient<IPaymentStrategy, AlipayAdapter>();
```
---
## 8. 代理模式(Proxy)
**实践场景**:权限、缓存、远程调用。
```csharp
public class RepositoryProxy<T> : IRepository<T>
{
private readonly IRepository<T> _inner;
public RepositoryProxy(IRepository<T> inner) { _inner = inner; }
public void Add(T entity) { /*权限校验*/ _inner.Add(entity); }
}
// 注册
services.Decorate(typeof(IRepository<>), typeof(RepositoryProxy<>));
```
---
## 9. 命令模式(Command)
**实践场景**:任务队列、事件、撤销。
```csharp
public interface ICommand { void Execute(); }
public class CreateOrderCommand : ICommand { public void Execute() { /*...*/ } }
public class CommandInvoker
{
private readonly IEnumerable<ICommand> _commands;
public CommandInvoker(IEnumerable<ICommand> commands) { _commands = commands; }
public void ExecuteAll() { foreach (var cmd in _commands) cmd.Execute(); }
}
// 注册
services.AddTransient<ICommand, CreateOrderCommand>();
```
---
## 10. 模板方法模式(Template Method)
**实践场景**:模块基类、流程控制。
```csharp
public abstract class BaseModule
{
public void RegisterModule()
{
PreRegister();
DoRegister();
PostRegister();
}
protected virtual void PreRegister() { }
protected abstract void DoRegister();
protected virtual void PostRegister() { }
}
```
---
## 11. 生成器模式(Builder)
**实践场景**:复杂对象构建,如配置、SQL、Http请求。
```csharp
public class DbContextBuilder
{
private string _connStr;
public DbContextBuilder UseSqlServer(string connStr) { _connStr = connStr; return this; }
public MyDbContext Build() => new MyDbContext(_connStr);
}
```
---
## 12. 享元模式(Flyweight)
**实践场景**:缓存、对象池。
```csharp
public class DbContextPool
{
private readonly Dictionary<string, MyDbContext> _pool = new();
public MyDbContext Get(string connStr)
{
if (!_pool.ContainsKey(connStr))
_pool[connStr] = new MyDbContext(connStr);
return _pool[connStr];
}
}
```
---
## 13. 组合模式(Composite)
**实践场景**:菜单、树形结构、模块组合。
```csharp
public interface IModuleComponent { void Init(); }
public class ModuleGroup : IModuleComponent
{
private readonly List<IModuleComponent> _children = new();
public void Add(IModuleComponent child) => _children.Add(child);
public void Init() { foreach (var c in _children) c.Init(); }
}
```
---
## 14. 备忘录模式(Memento)
**实践场景**:快照、撤销、配置回滚。
```csharp
public class ConfigMemento { public string State { get; set; } }
public class ConfigOriginator
{
public string State { get; set; }
public ConfigMemento Save() => new ConfigMemento { State = State };
public void Restore(ConfigMemento m) => State = m.State;
}
```
---
## 15. 状态模式(State)
**实践场景**:订单状态、流程引擎。
```csharp
public interface IOrderState { void Handle(OrderContext ctx); }
public class PaidState : IOrderState { public void Handle(OrderContext ctx) { /*...*/ } }
public class OrderContext
{
public IOrderState State { get; set; }
public void Request() => State.Handle(this);
}
```
---
## 16. 访问者模式(Visitor)
**实践场景**:对象结构遍历、代码生成。
```csharp
public interface IModuleVisitor { void Visit(BaseModule module); }
public class ModulePrinter : IModuleVisitor { public void Visit(BaseModule module) { /*...*/ } }
```
---
## 17. 解释器模式(Interpreter)
**实践场景**:表达式解析、规则引擎。
```csharp
public interface IExpression { int Interpret(); }
public class NumberExpression : IExpression { public int Value; public int Interpret() => Value; }
```
---
## 18. 中介者模式(Mediator)
**实践场景**:模块通信、事件聚合。
```csharp
public interface IMediator { void Send(string message, object sender); }
public class ModuleMediator : IMediator { /*...*/ }
```
---
## 19. 桥接模式(Bridge)
**实践场景**:抽象与实现分离,如不同数据库、不同支付。
```csharp
public interface IDbImplementor { void Connect(); }
public class SqlServerImplementor : IDbImplementor { public void Connect() { /*...*/ } }
public class DbBridge
{
private IDbImplementor _impl;
public DbBridge(IDbImplementor impl) { _impl = impl; }
public void Connect() => _impl.Connect();
}
```
---
## 20. 原型模式(Prototype)
**实践场景**:对象克隆、配置模板。
```csharp
public interface IPrototype<T> { T Clone(); }
public class ConfigPrototype : IPrototype<ConfigPrototype>
{
public string Value;
public ConfigPrototype Clone() => (ConfigPrototype)this.MemberwiseClone();
}
```
---
## 21. 管道/过滤器模式(Pipeline/Filter)
**实践场景**:请求处理、过滤器链。
```csharp
public interface IPipelineStep { void Process(RequestContext ctx); }
public class AuthStep : IPipelineStep { public void Process(RequestContext ctx) { /*...*/ } }
```
---
## 22. 外观模式(Facade)
**实践场景**:简化复杂子系统,如支付、缓存、消息。
```csharp
public class PaymentFacade
{
private readonly IPaymentStrategy _alipay;
private readonly IPaymentStrategy _wechat;
public PaymentFacade(IPaymentStrategy alipay, IPaymentStrategy wechat)
{
_alipay = alipay; _wechat = wechat;
}
public void PayByAlipay() => _alipay.Pay();
public void PayByWeChat() => _wechat.Pay();
}
```
---
## 23. 数据访问对象模式(DAO)
**实践场景**:数据持久化,仓储层。
```csharp
public interface IUserDao { User Get(int id); }
public class UserDao : IUserDao { public User Get(int id) { /*...*/ } }
```
---
## 24. 依赖注入模式(DI)
**实践场景**:你的整个框架都在用!
```csharp
// 通过 IServiceCollection 注册和注入
services.AddScoped<IUserService, UserService>();
```
---
## 25. 发布-订阅模式(Pub/Sub)
**实践场景**:事件、消息、通知。
```csharp
public class EventBus
{
public event Action<string> OnMessage;
public void Publish(string msg) => OnMessage?.Invoke(msg);
}
```
---
## 26. 领域驱动设计(DDD)相关模式
- **聚合根(Aggregate Root)**:你的 BaseEntity、仓储等
- **领域服务(Domain Service)**:Manager 层
- **值对象(Value Object)**:如 Money、Address
---
## 27. 空对象模式(Null Object)
**实践场景**:避免 null 判断。
```csharp
public class NullLogger : ILogger
{
public void Log(string msg) { /* 什么都不做 */ }
}
```
---
## 28. 对象池模式(Object Pool)
**实践场景**:DbContext、连接池。
```csharp
public class DbContextPool
{
private readonly Queue<MyDbContext> _pool = new();
public MyDbContext Rent() => _pool.Count > 0 ? _pool.Dequeue() : new MyDbContext();
public void Return(MyDbContext ctx) => _pool.Enqueue(ctx);
}
```
---
## 29. 延迟加载(Lazy Load)
**实践场景**:属性懒加载。
```csharp
public class User
{
private Lazy<List<Order>> _orders;
public User(Func<List<Order>> orderFactory)
{
_orders = new Lazy<List<Order>>(orderFactory);
}
public List<Order> Orders => _orders.Value;
}
```
---
## 30. 组合应用建议
- **仓储层**:工厂、装饰器、代理、DAO、单例、对象池
- **服务层**:策略、模板方法、领域服务、状态、命令
- **中间件**:责任链、装饰器、管道
- **事件/消息**:观察者、发布-订阅、中介者
- **第三方集成**:适配器、桥接、外观
- **配置/缓存**:单例、享元、备忘录、原型
- **模块化**:组合、模板方法、访问者
---
### 总结
- 你可以在**仓储、服务、事件、支付、配置、模块、管道**等各层灵活实践上述设计模式。
- 推荐用依赖注入和实例对象,避免静态。
- 设计模式不是越多越好,而是要理解其思想,按需组合。
如需某个模式的详细实现或在你框架中的最佳实践代码,欢迎继续提问!
无评论