思考一种好的架构(三)
这节说下最最最核心的库
数据持久化ORM
其实还有很多关键点没说,但是我都跳过了,先说实现场景,再说架构,由浅入深
这里我使用的是Chloe.ORM,用起来比较顺手,也很轻,便于扩展,没有太大的问题,可以很方便的做事件(读写分离)CQRS,(工作单元)WorkOfUnit
/// <summary> /// 单次请求中DC上下配置对象 /// </summary> public interface IDCScoped: IDbConnectionFactory { /// <summary> /// 数据库连接字符串 /// </summary> string ConnectionString { get; } /// <summary> /// 操作类型 /// </summary> DCOperationType OperationType { get; } /// <summary> /// 选择操作类型 /// </summary> /// <param name="connectionString"></param> /// <param name="operationType"></param> void SelectOpeation(string connectionString, DCOperationType operationType); }
/// <summary> /// 数据库范围 /// </summary> public class DCScope : IDCScoped { /// <summary> /// 数据库连接上下字符串 /// </summary> public string ConnectionString { get;private set; } /// <summary> /// 操作类型 /// </summary> public DCOperationType OperationType { get; private set; } /// <summary> /// 创建DC /// </summary> /// <returns></returns> public IDbConnection CreateConnection() { return new MySqlConnection(ConnectionString); } /// <summary> /// 选择操作 /// </summary> /// <param name="connectionString"></param> /// <param name="operationType"></param> public void SelectOpeation(string connectionString, DCOperationType operationType) { this.ConnectionString = connectionString; this.OperationType = operationType; } } /// <summary> /// DC操作类型 /// </summary> public enum DCOperationType { /// <summary> /// 读操作 /// </summary> Query = 0, /// <summary> /// 写操作 /// </summary> Command=1 }
public static class IQueryExtend { public static IQuery<T> EmptyCheck<T>(this IQuery<T> query,object judgeValue, Expression<Func<T, bool>> predicate) { if (judgeValue!=null) { return query.Where(predicate); } return query; } }
这个只是一个非空判断的扩展Where方法,单独写出来只是为了表示Chloe.ORM一切都归它管,扩展方法也是
public static class Startup { public static void ConfigureServices(IServiceCollection services) { services.AddScoped<IDCScoped, DCScope>(); services.AddScoped<IDbContext>(x=> new MySqlContext(x.GetService<IDCScoped>())); } public static void Configure(IApplicationBuilder app, IHostingEnvironment env) { } }
这个注入了IDScoped对象和IDbContext对象
IDScoped 是保存每次需要数据库的信息
ORM.Chloe.DoMain
负责维护一个数据库上下文和它的生命周期,Chloe.ORM的扩展也归它管,但是具体要选哪个数据库创建对象就不归它管了,谁爱管谁管,反正我不负责选则数据库的业务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)