# 设计理念
在普遍的框架设计中,框架中支持的功能都会具有默认的实现,并且在一定程度上会非常的臃肿不适用于扩展。
在 Air.Cloud 中,Air.Cloud.Core 仅包含功能接口定义,我们把这部分定义称作为 Standard(标准),除了一些特殊的标准需要默认定义之外,其他标准仅包含接口。
还有一部分是插件,框架内提供了一些默认的插件,你可以把它当作为以前我们使用的 Util 类。

基本上 Air.Cloud 所有模块都是可以从 NuGet 中找寻替换版本或者自行实现相关功能,并且我们也欢迎你贡献独属于你自己的实现。
# 标准与实现的关系
┌─────────────────────────────────────────┐
│ Air.Cloud.Core │
│ (定义标准接口 Standard) │
│ ┌───────────────────────────────────┐ │
│ │ IAppCacheStandard │ │
│ └───────────────────────────────────┘ │
└──────────────┬──────────────────────────┘
│ 实现
▼
┌─────────────────────────────────────────┐
│ Modules (实现标准) │
│ ┌───────────────────────────────────┐ │
│ │ RedisCacheDependency │ │
│ │ MemoryCacheDependency │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘
# 设计优点
多态 - 屏蔽了实现对现有业务代码的影响,在多个标准实现之间可以随意切换而不需要调整代码
简洁 - 简化框架核心的臃肿代码,减少了框架对于其他 NuGet 包的引用
快速 - 由于框架核心不实现任何功能,框架的加载速度会非常快
轻量 - 发布包的大小随着你对于实现的引用而变化,默认只有十几兆左右即可运行
自由 - 更好的支持,不必纠结任何实现的问题,实现有问题你就重新编写,自行注入,不需要等作者修复而带来的额外时间消耗
# 设计缺点
历史遗留 - 框架是基于 Furion v3.8.6(MIT) 的部分代码余烬中新生,包含了一部分旧代码,但是该部分已经抽取成单独的类库,后续 v2.0 阶段将会将其优化
发展局限 - 框架目前仅支持对于 WebAPI 方向,后续 v2.0 将会支持更多的功能
# 使用场景
# 场景一:切换缓存实现
假设项目当前使用 Redis 缓存,现在需要切换到内存缓存(用于测试环境):
// 原来的 Redis 缓存实现
services.AddSingleton<IAppCacheStandard, RedisCacheDependency>();
// 切换到内存缓存(不需要修改业务代码)
services.AddSingleton<IAppCacheStandard, MemoryCacheDependency>();
// 业务代码保持不变
var cache = AppRealization.Cache;
cache.Set("key", "value");
var value = cache.Get<string>("key");
# 场景二:自定义日志实现
// 定义自定义日志实现
public class CustomLogDependency : ITraceLogStandard
{
public void Log(string message, LogLevel level)
{
// 自定义日志逻辑
Console.WriteLine($"[{level}] {message}");
}
}
// 注入自定义实现
AppRealization.SetDependency<ITraceLogStandard>(new CustomLogDependency());
# 场景三:替换消息队列
// 使用 Kafka 消息队列
services.AddSingleton<IMessageQueueStandard, KafkaMessageQueueDependency>();
// 或者使用 RabbitMQ 消息队列
services.AddSingleton<IMessageQueueStandard, RabbitMQMessageQueueDependency>();
// 业务代码保持不变
var messageQueue = AppRealization.Queue;
messageQueue.Publish(config, message);
# 实现最佳实践
命名规范
- 标准接口命名:
I{功能名}Standard - 实现类命名:
{功能名}Dependency
- 标准接口命名:
依赖注入
- 优先使用
services.AddSingleton注册标准实现 - 避免使用
services.AddTransient,除非有特殊需求
- 优先使用
扩展性
- 保留标准接口的扩展点
- 提供合理的默认值
- 支持配置化
文档
- 为每个标准编写清晰的文档
- 提供使用示例
- 说明注意事项