예제 #1
0
        public void ShardingStrategyCRUDTest()
        {
            var strategy = new ShardingStrategy()
            {
                ID                = "AreaTableSharding",
                DisplayName       = "地区分表策略",
                PostFixListConfig = "sd,hb,gd,bj,sz,tj,sx,nm,hb,hn,sh",
                ShardingType      = ShardingType.Enum
            };

            try
            {
                ShardingStrategyService.GetInstance().DeleteShardingStrategy(strategy.ID);
                ShardingStrategyService.GetInstance().SaveShardingStrategy(strategy);
                var queryStrategy = ShardingStrategyService.GetInstance().GetShardingStrategy(strategy.ID);

                Assert.IsNotNull(queryStrategy);
                Assert.AreEqual(queryStrategy.DisplayName, strategy.DisplayName);
                Assert.AreEqual(queryStrategy.PostFixListConfig, strategy.PostFixListConfig);
                Assert.AreEqual(queryStrategy.ShardingType, strategy.ShardingType);

                TableShardingStrategy table = new TableShardingStrategy(queryStrategy);
                Assert.IsNotNull(table);
                Assert.AreEqual(queryStrategy.DisplayName, table.DisplayName);
                Assert.AreEqual(queryStrategy.PostFixListConfig, table.PostFixListConfig);
                Assert.AreEqual(queryStrategy.ShardingType, table.ShardingType);
            }
            finally
            {
                ShardingStrategyService.GetInstance().DeleteShardingStrategy(strategy.ID);
            }
        }
        /// <summary>
        /// 获取分区表名称
        /// </summary>
        /// <param name="strategy">分区策略</param>
        /// <param name="logicalTableName">逻辑表名</param>
        /// <returns>分区表名称</returns>
        public List <string> GetShardingTableNames(TableShardingStrategy strategy, string logicalTableName)
        {
            var tables = new List <string>();

            strategy.PostFixValueList.ForEach(i => tables.Add(string.Format("{0}{1}", logicalTableName, i)));

            return(tables);
        }
        /// <summary>
        /// 获取单键表分区计算器
        /// </summary>
        /// <param name="strategy">表Sharding策略</param>
        /// <returns>表分区分库计算器</returns>
        public static ISingleKeyTableShardingAlgorithm GetSingKeyShardingAlgorithm(TableShardingStrategy strategy)
        {
            ISingleKeyTableShardingAlgorithm algorithm = null;

            switch (strategy.ShardingType)
            {
            case ShardingType.Year:
                algorithm = new TableShardingYearAlgorithm();
                break;

            case ShardingType.Enum:
                algorithm = new TableShardingEnumAlgorithm();
                break;

            case ShardingType.Hash:
                algorithm = new TableShardingHashAlgorithm(strategy.ShardingFactor);
                break;

            default:
                break;
            }

            return(algorithm);
        }