コード例 #1
0
ファイル: Insert.cs プロジェクト: yj1118/CodeArt-Framework
        private DynamicData GetInsertData(DomainObject root, DomainObject parent, DomainObject obj)
        {
            Type objectType = this.ObjectType;

            var tips = Util.GetPropertyTips(objectType);
            var data = new DynamicData(); //由于对象会被缓存,因此不从池中获取DynamicData

            foreach (var tip in tips)
            {
                InsertAndCollectValue(root, parent, obj, tip, data);
            }

            if (this.Type == DataTableType.ValueObject)
            {
                //需要补充编号
                data.Add(EntityObject.IdPropertyName, GetObjectId(obj));
                //插入时默认为1
                data.Add(GeneratedField.AssociatedCountName, 1);
            }

            if (this.Type == DataTableType.EntityObject)
            {
                //插入时默认为1
                data.Add(GeneratedField.AssociatedCountName, 1);
            }

            if (this.Type == DataTableType.AggregateRoot)
            {
                if (this.IsSnapshot)
                {
                    data.Add(Util.SnapshotTime, DateTime.Now);
                    data.Add(Util.SnapshotLifespan, this.ObjectTip.SnapshotLifespan);
                }
            }
            else
            {
                //补充外键
                data.Add(GeneratedField.RootIdName, GetObjectId(root));
            }

            //this.Mapper.FillInsertData(obj, data, this);


            if (!this.IsDerived)
            {
                //只有非派生表才记录TypeKey和DataVersion
                data.Add(GeneratedField.TypeKeyName, string.Empty); //追加类型编号,非派生类默认类型编号为空
                data.Add(GeneratedField.DataVersionName, 1);        //追加数据版本号
            }

            if (this.IsEnabledMultiTenancy)
            {
                data.Add(GeneratedField.TenantIdName, AppSession.TenantId);
            }

            return(data);
        }
コード例 #2
0
        public DynamicData GenerateTestData()
        {
            var data = new DynamicData();

            foreach (var field in schema.Fields)
            {
                var fieldData = new JObject();

                if (field.Partitioning == "invariant")
                {
                    var value = GenerateValue(field);

                    fieldData["iv"] = value;
                }
                else
                {
                    foreach (var language in languages.Items)
                    {
                        var value = GenerateValue(field);

                        fieldData[language.Iso2Code] = value;
                    }
                }

                data.Add(field.Name, fieldData);
            }

            return(data);
        }
コード例 #3
0
        public static string CreateCommand(string signature, string input, IKeySym privateKey)
        {
            IParser <ParamArgs> parser = new CommandParser();
            ParamArgs           output = parser.Parse(input);

            if (output.Count == 0)
            {
                throw new OperationCanceledException("Could not parse command.");
            }

            Header header     = new Header(signature, "", output.Get <string>("Command"));
            string jsonHeader = Newtonsoft.Json.JsonConvert.SerializeObject(header);

            DynamicData detail = new DynamicData();

            foreach (string key in output.ToDictionary().Keys)
            {
                if (!key.Equals("Command"))
                {
                    detail.Add(key, output.Get <object>(key));
                }
            }
            string  jsonDetail = Newtonsoft.Json.JsonConvert.SerializeObject(detail.GetDictionary());
            Crypter crypter    = new Crypter(privateKey);

            string final = string.Format(Format, jsonHeader, jsonDetail);

            return(crypter.Encrypt(final));
        }
コード例 #4
0
ファイル: Query.cs プロジェクト: yj1118/CodeArt-Framework
 private void AddToTenant(DynamicData param)
 {
     //if (this.IsEnabledMultiTenancy) 不一定是判断this表,因为在关联表查询中,有可能是Middle表是开启了租户,但是被引用的根表(例如User)没有开启租户,这时候还是要给租户条件
     // 为了方便编码,我们认为只要配置文件启动了多租户,在传递条件时,我们就会赋予租户的参数
     if (DomainDrivenConfiguration.Current.MultiTenancyConfig.IsEnabled)
     {
         param.Add(GeneratedField.TenantIdName, AppSession.TenantId);
     }
 }
コード例 #5
0
ファイル: Insert.cs プロジェクト: yj1118/CodeArt-Framework
        private void InsertAndCollectValueObject(DomainObject root, DomainObject parent, DomainObject current, PropertyRepositoryAttribute tip, DynamicData data)
        {
            var field = GetQuoteField(this, tip.PropertyName);
            var obj   = current.GetValue(tip.Property) as DomainObject;

            if (obj.IsEmpty())
            {
                data.Add(field.Name, Guid.Empty);
            }
            else
            {
                (obj as IValueObject).TrySetId(Guid.NewGuid());
                var id = GetObjectId(obj);
                data.Add(field.Name, id);

                //保存数据
                var child = GetRuntimeTable(this, tip.PropertyName, obj.ObjectType);
                child.InsertMember(root, current, obj);
            }
        }
コード例 #6
0
ファイル: Common.cs プロジェクト: yj1118/CodeArt-Framework
        internal long GetIdentity()
        {
            var query = GetIncrementIdentity.Create(this);
            var sql   = query.Build(null, this);

            if (this.IsEnabledMultiTenancy)
            {
                var param = new DynamicData();
                param.Add(GeneratedField.TenantIdName, AppSession.TenantId);
                return(SqlHelper.ExecuteScalar <long>(this.ConnectionName, sql, param));
            }
            else
            {
                return(SqlHelper.ExecuteScalar <long>(this.ConnectionName, sql));
            }
        }
コード例 #7
0
ファイル: SqlHelper.cs プロジェクト: yj1118/CodeArt-Framework
        private static void LoadRowData(IDataReader reader, DynamicData data, int fieldCount)
        {
            for (var i = 0; i < fieldCount; i++)
            {
                if (reader.IsDBNull(i))
                {
                    //过滤空数据,只要是空数据,不予加入到结果集中,这对由于引用了外部根,
                    //外部内聚根被删除了导致的情况很有帮助,而且过滤空数据也符合领域驱动empty的原则,
                    //因此数据直接过滤
                    continue;
                }

                var name  = reader.GetName(i);
                var value = reader.GetValue(i);
                data.Add(name, value);
            }
        }
コード例 #8
0
        private object ReadMemberFromData(PropertyRepositoryAttribute tip, DynamicData data)
        {
            var name    = _getNameWithSeparated(tip.PropertyName);
            var subData = new DynamicData(); //由于subData要参与构造,所以不从池中取

            foreach (var p in data)
            {
                var dataName = p.Key;
                if (dataName.StartsWith(name))
                {
                    var subName = _getNextName(dataName);
                    subData.Add(subName, p.Value);
                }
            }

            if (subData.IsEmpty())
            {
                if (tip.DomainPropertyType == DomainPropertyType.AggregateRoot)
                {
                    var idName = _getIdName(tip.PropertyName);
                    var id     = data.Get(idName);
                    return(ReadSnapshot(tip, id));
                }
                return(DomainObject.GetEmpty(tip.PropertyType));
            }


            var  typeKey    = (string)subData.Get(GeneratedField.TypeKeyName);
            Type objectType = null;

            if (this.IsDynamic)
            {
                objectType = tip.PropertyType;
            }
            else
            {
                objectType = string.IsNullOrEmpty(typeKey) ? tip.PropertyType : DerivedClassAttribute.GetDerivedType(typeKey);
            }


            var child = GetRuntimeTable(this, tip.PropertyName, objectType);

            //先尝试中构造上下文中得到
            return(child.GetObjectFromConstruct(subData) ?? child.CreateObject(objectType, subData, QueryLevel.None)); //成员始终是QueryLevel.None的方式加载
        }
コード例 #9
0
ファイル: Insert.cs プロジェクト: yj1118/CodeArt-Framework
        private void InsertAndCollectValue(DomainObject root, DomainObject parent, DomainObject current, PropertyRepositoryAttribute tip, DynamicData data)
        {
            if (this.IsSnapshot && !tip.Snapshot)
            {
                return;                                   //如果是快照,那么需要过滤不参与快照的属性
            }
            //if (tip.TrySaveData(this.ObjectType, current, data)) return;

            switch (tip.DomainPropertyType)
            {
            case DomainPropertyType.Primitive:
            {
                var value = GetPrimitivePropertyValue(current, tip);
                data.Add(tip.PropertyName, value);
            }
            break;

            case DomainPropertyType.PrimitiveList:
            {
                var value = current.GetValue(tip.Property);
                //仅存中间表
                var values = GetValueListData(value);
                var child  = GetChildTableByRuntime(this, tip);       //无论是派生还是基类,基础表对应的中间表都一样
                child.InsertMiddle(root, current, values);
            }
            break;

            case DomainPropertyType.ValueObject:
            {
                InsertAndCollectValueObject(root, parent, current, tip, data);
            }
            break;

            case DomainPropertyType.AggregateRoot:
            {
                var    field = GetQuoteField(this, tip.PropertyName);
                object obj   = current.GetValue(tip.Property);
                var    id    = GetObjectId(obj);
                data.Add(field.Name, id);
            }
            break;

            case DomainPropertyType.EntityObject:
            {
                var obj = current.GetValue(tip.Property) as DomainObject;

                var id    = GetObjectId(obj);
                var field = GetQuoteField(this, tip.PropertyName);
                data.Add(field.Name, id);          //收集外键

                //保存引用数据
                if (!obj.IsEmpty())
                {
                    var child = GetRuntimeTable(this, tip.PropertyName, obj.ObjectType);
                    child.InsertMember(root, current, obj);
                }
            }
            break;

            case DomainPropertyType.AggregateRootList:
            {
                //仅存中间表
                var objs  = current.GetValue(tip.Property) as IEnumerable;
                var child = GetChildTableByRuntime(this, tip);        //无论是派生还是基类,基础表对应的中间表都一样
                child.Middle.InsertMiddle(root, current, objs);
            }
            break;

            case DomainPropertyType.ValueObjectList:
            case DomainPropertyType.EntityObjectList:
            {
                InsertMembers(root, parent, current, tip);
            }
            break;
            }
        }
コード例 #10
0
ファイル: Update.cs プロジェクト: yj1118/CodeArt-Framework
        /// <summary>
        ///
        /// </summary>
        /// <param name="root"></param>
        /// <param name="parent"></param>
        /// <param name="current"></param>
        /// <param name="tip"></param>
        /// <param name="data"></param>
        /// <returns>当内部成员发生变化,返回true</returns>
        private bool UpdateAndCollectChangedValue(DomainObject root, DomainObject parent, DomainObject current, PropertyRepositoryAttribute tip, DynamicData data)
        {
            switch (tip.DomainPropertyType)
            {
            case DomainPropertyType.Primitive:
            {
                if (current.IsPropertyChanged(tip.Property))
                {
                    var value = GetPrimitivePropertyValue(current, tip);
                    data.Add(tip.PropertyName, value);
                    return(true);
                }
            }
            break;

            case DomainPropertyType.PrimitiveList:
            {
                if (current.IsPropertyChanged(tip.Property))
                {
                    //删除老数据
                    var child = GetChildTableByRuntime(this, tip);
                    child.DeleteMiddleByMaster(root, current);

                    var value = current.GetValue(tip.Property);
                    //仅存中间表
                    var values = GetValueListData(value);
                    child.InsertMiddle(root, current, values);
                    return(true);
                }
            }
            break;

            //case DomainPropertyType.ValueObject:
            //    {
            //        if (current.IsPropertyChanged(tip.Property))
            //        {
            //            //删除原始数据
            //            DeleteMemberByOriginalData(root, parent, current, tip);
            //            //新增数据
            //            InsertAndCollectValueObject(root, parent, current, tip, data);
            //            return true;
            //        }
            //    }
            //    break;
            case DomainPropertyType.AggregateRoot:
            {
                if (current.IsPropertyChanged(tip.Property))
                {
                    var    field = GetQuoteField(this, tip.PropertyName);
                    object obj   = current.GetValue(tip.Property);
                    var    id    = GetObjectId(obj);
                    data.Add(field.Name, id);
                    return(true);
                }
            }
            break;

            case DomainPropertyType.ValueObject:     //虽然值对象的成员不会变,但是成员的成员也许会改变
            case DomainPropertyType.EntityObject:
            {
                if (current.IsPropertyChanged(tip.Property))
                {
                    var obj = current.GetValue(tip.Property) as DomainObject;
                    if (tip.DomainPropertyType == DomainPropertyType.ValueObject)
                    {
                        (obj as IValueObject).TrySetId(Guid.NewGuid());
                    }

                    var id    = GetObjectId(obj);
                    var field = GetQuoteField(this, tip.PropertyName);
                    data.Add(field.Name, id);          //收集外键

                    //删除原始数据
                    DeleteMemberByOriginalData(root, parent, current, tip);

                    //保存引用数据
                    if (!obj.IsEmpty())
                    {
                        var child = GetRuntimeTable(this, tip.PropertyName, obj.ObjectType);
                        child.InsertMember(root, current, obj);
                    }
                    return(true);
                }
                else if (current.IsPropertyDirty(tip.Property))
                {
                    //如果引用的内聚成员是脏对象,那么需要修改
                    var obj = current.GetValue(tip.Property) as DomainObject;
                    if (!obj.IsEmpty())
                    {
                        //从衍生表中找到对象表
                        var child = GetRuntimeTable(this, tip.PropertyName, obj.ObjectType);
                        child.UpdateMember(root, parent, obj);
                    }
                    return(true);
                }
            }
            break;

            case DomainPropertyType.AggregateRootList:
            {
                if (current.IsPropertyChanged(tip.Property))
                {
                    //删除老数据
                    var child = GetChildTableByRuntime(this, tip);
                    child.Middle.DeleteMiddleByMaster(root, current);

                    //追加新数据
                    var objs = current.GetValue(tip.Property) as IEnumerable;
                    child.Middle.InsertMiddle(root, current, objs);
                    return(true);
                }
            }
            break;

            case DomainPropertyType.ValueObjectList:
            case DomainPropertyType.EntityObjectList:
            {
                if (current.IsPropertyChanged(tip.Property))
                {
                    //引用关系发生了变化,删除重新追加
                    //这里要注意,需要删除的是数据库的数据,所以要重新读取
                    //删除原始数据
                    DeleteMembersByOriginalData(root, parent, current, tip);

                    //加入新数据
                    InsertMembers(root, parent, current, tip);
                    return(true);
                }
                else if (current.IsPropertyDirty(tip.Property))
                {
                    //引用关系没变,只是数据脏了
                    UpdateMembers(root, parent, current, tip);
                    return(true);
                }
            }
            break;
            }
            return(false);
        }
コード例 #11
0
        internal string Process(string commandText, DynamicData param)
        {
            if (this.IsEmpty())
            {
                return(commandText);
            }

            //先处理any
            foreach (var any in _anys)
            {
                if (param.ContainsKey(any.ParamName))
                {
                    commandText = commandText.Replace(any.Placeholder, any.Content);
                }
                else
                {
                    commandText = commandText.Replace(any.Placeholder, "0=0"); //没有参数表示永远为真,这里不能替换为空文本,因为会出现where 没有条件的BUG,所以为 where 0=0
                }
            }


            foreach (var like in _likes)
            {
                var name  = like.ParamName;
                var value = param.Get(name) as string;
                if (value == null)
                {
                    continue;                //因为有any语法,所以没有传递参数也正常
                }
                if (like.After && like.Before)
                {
                    param.Set(name, string.Format("%{0}%", value));
                }
                else if (like.After)
                {
                    param.Set(name, string.Format("{0}%", value));
                }
                else if (like.Before)
                {
                    param.Set(name, string.Format("%{0}", value));
                }
            }

            foreach (var sin in _ins)
            {
                var name   = sin.ParamName;
                var values = param.Get(name) as IEnumerable;
                if (values == null)
                {
                    continue;                  //因为有any语法,所以没有传递参数也正常
                }
                param.Remove(name);

                if (values.Exists())
                {
                    using (var temp = StringPool.Borrow())
                    {
                        var code  = temp.Item;
                        int index = 0;
                        code.AppendFormat("{0} in (", sin.Field);
                        foreach (var value in values)
                        {
                            var valueName = string.Format("{0}{1}", name, index);
                            param.Add(valueName, value);
                            code.AppendFormat("@{0},", valueName);
                            index++;
                        }
                        if (code.Length > 1)
                        {
                            code.Length--;
                        }
                        code.Append(")");

                        commandText = commandText.Replace(sin.Placeholder, code.ToString());
                    }
                }
                else
                {
                    commandText = commandText.Replace(sin.Placeholder, "0=1"); //在in语句中,如果 id in (),没有任何匹配的数值条件,那么就是无匹配结果,所以0=1
                }
            }

            return(commandText);
        }
コード例 #12
0
        protected void GetQueue(string sql, params object[] args)
        {
            IDbManager   dbManager = ObjectPool.Instance.Resolve <IDbManager>();
            IDataCommand db        = dbManager.GetDatabase(DatabaseNames.SMSGW);

            List <QueueWork> workItem = db.Query <QueueWork>(sql, args);
            MutableObservableCollection <ComposeMessageModel> buffer = new MutableObservableCollection <ComposeMessageModel>();

            if (workItem.Any())
            {
                List <DailyTrigger>         daily;
                List <WeeklyTrigger>        weekly;
                List <MonthlyTrigger>       monthly;
                CommandParser               parser;
                Dictionary <string, string> parsingCommand;
                DynamicData         parameters;
                ComposeMessageModel model;

                foreach (QueueWork item in workItem)
                {
                    model = new ComposeMessageModel();

                    parser         = new CommandParser();
                    parsingCommand = parser.Parse(item.Command);
                    parameters     = new DynamicData();
                    foreach (string key in parsingCommand.Keys)
                    {
                        if (!key.Equals("Command"))
                        {
                            parameters.Add(key, parsingCommand[key]);
                        }
                    }

                    model.Source      = item.Source;
                    model.SeqNbr      = item.SeqNbr;
                    model.Phonenumber = (string)parameters.GetDictionary()["number"];
                    model.Message     = (string)parameters.GetDictionary()["message"];
                    model.Date        = item.Created.ToString("dd/MM/yyyy");
                    model.Time        = item.Created.ToString("HH:mm");
                    model.Enabled     = item.Enabled;

                    if (item.NextExecuted.Ticks > 0)
                    {
                        model.NextExecuted = DateTime.Parse(item.NextExecuted.ToString("dd/MM/yyyy HH:mm"));
                    }

                    string triggerPrefix = string.Empty;
                    if (!string.IsNullOrEmpty(item.ScheduleID))
                    {
                        triggerPrefix = item.ScheduleID.Substring(0, 1);
                    }
                    switch (triggerPrefix)
                    {
                    case "D":
                        daily = db.Query <DailyTrigger>("GetDailyTriggerByID", new { ID = item.ScheduleID });
                        if (daily.Any())
                        {
                            model.TriggerOptions = TriggerOptions.Daily;
                            model.RecursDay      = daily[0].RecursEvery;
                        }
                        break;

                    case "W":
                        weekly = db.Query <WeeklyTrigger>("GetWeeklyTriggerByID", new { ID = item.ScheduleID });
                        if (weekly.Any())
                        {
                            model.TriggerOptions          = TriggerOptions.Weekly;
                            model.RecursWeek              = weekly[0].RecursEvery;
                            model.WeeklyOptions.Monday    = weekly[0].Monday;
                            model.WeeklyOptions.Tuesday   = weekly[0].Tuesday;
                            model.WeeklyOptions.Wednesday = weekly[0].Wednesday;
                            model.WeeklyOptions.Thursday  = weekly[0].Thursday;
                            model.WeeklyOptions.Friday    = weekly[0].Friday;
                            model.WeeklyOptions.Saturday  = weekly[0].Saturday;
                            model.WeeklyOptions.Sunday    = weekly[0].Sunday;
                        }
                        break;

                    case "M":
                        monthly = db.Query <MonthlyTrigger>("GetMonthlyTriggerByID", new { ID = item.ScheduleID });
                        if (monthly.Any())
                        {
                            model.TriggerOptions = TriggerOptions.Monthly;

                            model.Months[0].IsSelected  = monthly[0].January;
                            model.Months[1].IsSelected  = monthly[0].February;
                            model.Months[2].IsSelected  = monthly[0].March;
                            model.Months[3].IsSelected  = monthly[0].April;
                            model.Months[4].IsSelected  = monthly[0].May;
                            model.Months[5].IsSelected  = monthly[0].June;
                            model.Months[6].IsSelected  = monthly[0].July;
                            model.Months[7].IsSelected  = monthly[0].August;
                            model.Months[8].IsSelected  = monthly[0].September;
                            model.Months[9].IsSelected  = monthly[0].October;
                            model.Months[10].IsSelected = monthly[0].November;
                            model.Months[11].IsSelected = monthly[0].December;

                            string[] days = monthly[0].Days.Split(',');
                            foreach (string day in days)
                            {
                                model.Days[Convert.ToInt32(day)].IsSelected = 1;
                            }
                        }
                        break;

                    case "O":
                        model.TriggerOptions = TriggerOptions.OneTime;
                        break;
                    }
                    buffer.Add(model);
                }
            }
            Source = buffer;
        }
コード例 #13
0
        private void TimerProcessingRequest_Elapsed(object sender, EventArgs e)
        {
            ////ensures that one thread enter a processing request section, in the same time reading sms section may will be occured.
            ////If another thread tries to enter a locked code, it will wait, block, until the object is released.
            lock (portColletion)
            {
                PacketEventArgs workItem = workerPoolManager.GetJob();
                if (workItem != null)
                {
                    BasicInformation currentConnection = portColletion.Get();
                    if (currentConnection != null)
                    {
                        List <string>    command = new List <string>();
                        ParameterizedMap parsingCommand;
                        try
                        {
                            string dataEncode = Encoding.GetEncoding("ibm850").GetString(workItem.Data);

                            Request request = Newtonsoft.Json.JsonConvert.DeserializeObject <Request>(dataEncode, new Newtonsoft.Json.JsonSerializerSettings
                            {
                                TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects
                            });
                            ICommandParser <ParameterizedMap> parser = new CommandParser();
                            parsingCommand = parser.Parse(request.QueueWorkItem.Command);

                            DynamicData parameters = new DynamicData();
                            foreach (string key in parsingCommand.ToDictionary().Keys)
                            {
                                if (!key.Equals("Command"))
                                {
                                    parameters.Add(key, parsingCommand.TryGet <object>(key));
                                }
                            }
                            parameters.Add("id", request.QueueWorkItem.SeqNbr == null ? "" : request.QueueWorkItem.SeqNbr);
                            command = parsingCommand.TryGet <string>("Command").Split('.').ToList();

                            ParameterizedMap param = new ParameterizedMap();
                            param.Add("base", currentConnection);
                            param.Add("packet", workItem);
                            param.Add("command", command);
                            param.Add("parameters", parameters);

                            string responseOut;
                            string encrypted;

                            Worker.IPipeline pipe = ObjectPool.Instance.Resolve <Worker.IPipeline>();

                            pipe.BeforePush(param);
                            responseOut = pipe.Push(param);
                            OnDataSent(responseOut.ToString());
                            pipe.AfterPush(param);

                            // send back to client if request workItem is send from tcp
                            if (workItem.Client != null)
                            {
                                Crypter crypter = new Crypter(new DefaultConfigurationKey());
                                encrypted = crypter.Encrypt(responseOut.ToString());
                                try
                                {
                                    this.Send(((IPEndPoint)workItem.Client.RemoteEndPoint).Port, ASCIIEncoding.ASCII.GetBytes(encrypted.ToString()));
                                }
                                catch (System.Net.Sockets.SocketException)
                                {
                                    // client was closed, dont raise error.
                                }
                                catch (ObjectDisposedException)
                                {
                                    // client was closed, dont raise error.
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            RaiseError(currentConnection, ex, "process request");
                        }
                    }
                    else
                    {
                        workerPoolManager.CurrentWorker.Add(workItem);
                    }
                }
            }
        }