這節說下最最最核心的庫
數據持久化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的擴展也歸它管,但是具體要選哪個數據庫創建對象就不歸它管了,誰愛管誰管,反正我不負責選則數據庫的業務