• 思考一种好的架构(三)


    这节说下最最最核心的库

    数据持久化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的扩展也归它管,但是具体要选哪个数据库创建对象就不归它管了,谁爱管谁管,反正我不负责选则数据库的业务

  • 相关阅读:
    《C++标准程序库》 第6章 STL Container
    《C++语言99个常见编程错误》
    单例模式
    《C++标准程序库》 第7章 Iterator Adapters
    Shell颜色封装(C++)
    《改善C++程序的150个建议》
    OpenCV之图片的创建、保存和复制
    XMLDOM对象方法:对象事件
    三国中最精辟的十句话
    中国十大名茶及鉴别方法
  • 原文地址:https://www.cnblogs.com/AnAng/p/12607292.html
Copyright © 2020-2023  润新知