Exemplo n.º 1
0
        /// <summary>
        /// 获取对象数据
        /// </summary>
        /// <param name="domainModel">领域模型</param>
        /// <param name="domainObject">领域对象</param>
        /// <param name="dataId">数据唯一标识</param>
        /// <param name="shardingValue">分库分表键值对</param>
        /// <returns>对象数据</returns>
        public List <DataTable> GetData(string domainModelID, string domainObjectID, string dataId, ShardingValue shardingValue = null)
        {
            if (string.IsNullOrWhiteSpace(domainModelID))
            {
                throw new ArgumentNullException("DataAccessService.GetData.domainModelID");
            }
            if (string.IsNullOrWhiteSpace(domainObjectID))
            {
                throw new ArgumentNullException("DataAccessService.GetData.domainObjectID");
            }
            if (string.IsNullOrWhiteSpace(dataId))
            {
                throw new ArgumentNullException("DataAccessService.GetData.dataId");
            }

            try
            {
                var domainModel = DomainModelManageService.GetInstance().GetDomainModel(domainModelID);
                if (domainModel == null)
                {
                    throw new Exception("Dae-0001: Cannot find DomainModel: " + domainModelID);
                }

                var domainObject = domainModel.DomainObjects.FirstOrDefault(i => i.ID == domainObjectID);
                if (domainObject == null)
                {
                    throw new Exception("Dae-0001: Cannot find DomainObject: " + domainObjectID);
                }

                return(DataAccessEngine.GetInstance().GetDataQueryService().GetData(domainModel, domainObject, dataId, shardingValue));
            }
            catch (Exception e)
            {
                throw new Exception("Dae-Query-001: 数据查询失败!", e);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        ///  删除数据
        /// </summary>
        /// <param name="domainModelID">领域模型ID</param>
        /// <param name="domainObjectID">领域对象ID</param>
        /// <param name="dataIds">数据唯一标识集合</param>
        /// <param name="shardingValue">分库分表键值对</param>
        public void Delete(string domainModelID, string domainObjectID, IList <string> dataIds, ShardingValue shardingValue = null)
        {
            if (string.IsNullOrWhiteSpace(domainModelID))
            {
                throw new ArgumentNullException("DataAccessService.Delete.domainModelID");
            }
            if (string.IsNullOrWhiteSpace(domainObjectID))
            {
                throw new ArgumentNullException("DataAccessService.Delete.domainObjectID");
            }
            if (dataIds == null || dataIds.Count == 0)
            {
                throw new ArgumentNullException("DataAccessService.Delete.dataIds");
            }

            try
            {
                var domainModel = DomainModelManageService.GetInstance().GetDomainModel(domainModelID);
                if (domainModel == null)
                {
                    throw new Exception("Dae-0001: Cannot find DomainModel: " + domainModelID);
                }

                var domainObject = domainModel.DomainObjects.FirstOrDefault(i => i.ID == domainObjectID);
                if (domainObject == null)
                {
                    throw new Exception("Dae-0001: Cannot find DomainObject: " + domainObjectID);
                }

                DataAccessEngine.GetInstance().GetDataDeleteService().DeleteByIDs(domainModel, domainObject, dataIds, shardingValue);
            }
            catch (Exception e)
            {
                throw new Exception("Dae-Delete-002: 数据批量删除失败!", e);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// 保存指定对象的数据
        /// </summary>
        /// <param name="domainModelID">领域模型ID</param>
        /// <param name="domainObjectID">领域对象ID</param>
        /// <param name="instances">对象实例</param>
        public void Save(string domainModelID, string domainObjectID, List <object> instances, ShardingValue shardingValue = null)
        {
            if (string.IsNullOrWhiteSpace(domainModelID))
            {
                throw new ArgumentNullException("DataAccessService.Save.domainModelID");
            }
            if (string.IsNullOrWhiteSpace(domainObjectID))
            {
                throw new ArgumentNullException("DataAccessService.Save.domainObjectID");
            }
            if (instances == null)
            {
                throw new ArgumentNullException("DataAccessService.Save.instances");
            }

            try
            {
                var domainModel = DomainModelManageService.GetInstance().GetDomainModel(domainModelID);
                if (domainModel == null)
                {
                    throw new Exception("Dae-0001: Cannot find DomainModel: " + domainModelID);
                }

                var domainObject = domainModel.DomainObjects.FirstOrDefault(i => i.ID == domainObjectID);
                if (domainObject == null)
                {
                    throw new Exception("Dae-0001: Cannot find DomainObject: " + domainObjectID);
                }

                var shardings = new List <ShardingValue>();
                if (shardingValue != null)
                {
                    instances.ForEach(i => shardings.Add(shardingValue));
                }

                DataAccessEngine.GetInstance().GetDataSaveService().SaveBatch(domainModel, domainObject, instances, shardings);
            }
            catch (Exception e)
            {
                throw new Exception("Dae-Save-001: 数据保存失败!", e);
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 更新指定对象的数据
        /// </summary>
        /// <param name="domainModelID">领域模型ID</param>
        /// <param name="domainObjectID">领域对象ID</param>
        /// <param name="instance">对象实例</param>
        public void Update(string domainModelID, string domainObjectID, object instance, ShardingValue shardingValue = null)
        {
            if (string.IsNullOrWhiteSpace(domainModelID))
            {
                throw new ArgumentNullException("DataAccessService.Update.domainModelID");
            }
            if (string.IsNullOrWhiteSpace(domainObjectID))
            {
                throw new ArgumentNullException("DataAccessService.Update.domainObjectID");
            }
            if (instance == null)
            {
                throw new ArgumentNullException("DataAccessService.Update.instance");
            }

            try
            {
                var domainModel = DomainModelManageService.GetInstance().GetDomainModel(domainModelID);
                if (domainModel == null)
                {
                    throw new Exception("Dae-0001: Cannot find DomainModel: " + domainModelID);
                }

                var domainObject = domainModel.DomainObjects.FirstOrDefault(i => i.ID == domainObjectID);
                if (domainObject == null)
                {
                    throw new Exception("Dae-0001: Cannot find DomainObject: " + domainObjectID);
                }

                DataAccessEngine.GetInstance().GetDataUpdateService().Update(domainModel, domainObject, instance, shardingValue);
            }
            catch (Exception e)
            {
                throw new Exception("Dae-Update-001: 数据保存失败!", e);
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 解析Sharding规则
        /// </summary>
        /// <param name="dataObject">数据对象</param>
        /// <param name="value">值</param>
        /// <returns>连接</returns>
        public IList <ShardingTarget> Parse(DataObject dataObject, ShardingValue value)
        {
            var dbNames = new List <string>();

            if (dataObject.IsDatabaseSharding && dataObject.DatabaseShardingStrategy != null)
            {
                var databaseStragety = dataObject.DatabaseShardingStrategy;
                var dblinks          = dataObject.DataSource.DbLinks.Select(i => i.Name).ToList();
                var calc             = ShardingStrategyFactory.GetSingKeyShardingAlgorithm(databaseStragety);
                switch (value.ShardingValueType)
                {
                case ShardingValueType.SINGLE:
                    dbNames.Add(calc.DoEqualSharding(dblinks, value));
                    break;

                case ShardingValueType.LIST:
                    dbNames.AddRange(calc.DoInSharding(dblinks, value).Distinct());
                    break;

                case ShardingValueType.RANGE:
                    dbNames.AddRange(calc.DoBetweenSharding(dblinks, value).Distinct());
                    break;

                default: break;
                }
            }
            else
            {
                dbNames.Add(dataObject.DataSource.DefaultDbLink.Name);
            }

            var tableList = new List <string>();

            if (dataObject.IsTableSharding && dataObject.TableShardingStrategy != null)
            {
                var tableNames = dataObject.ActualTableNames.Split(',').ToList();
                var calc       = ShardingStrategyFactory.GetSingKeyShardingAlgorithm(dataObject.TableShardingStrategy);
                switch (value.ShardingValueType)
                {
                case ShardingValueType.SINGLE:
                    tableList.Add(calc.DoEqualSharding(tableNames, value));
                    break;

                case ShardingValueType.LIST:
                    tableList.AddRange(calc.DoInSharding(tableNames, value).Distinct());
                    break;

                case ShardingValueType.RANGE:
                    tableList.AddRange(calc.DoBetweenSharding(tableNames, value).Distinct());
                    break;

                default: break;
                }
            }
            else
            {
                tableList.Add(dataObject.LogicTableName);
            }

            var result = new List <ShardingTarget>();

            foreach (var tableName in tableList)
            {
                var dbName = dataObject.DataSource.DbLinks.FirstOrDefault(i => i.Tables.FirstOrDefault(t => t.Name == tableName) != null);
                if (dbNames.Contains(dbName.Name))
                {
                    result.Add(new ShardingTarget()
                    {
                        DataSource = dbName.Name, TableName = tableName
                    });
                }
            }

            return(result);
        }