思考一種好的架構(三)

 

這節說下最最最核心的庫

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章