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); }
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); }
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)); }
private void AddToTenant(DynamicData param) { //if (this.IsEnabledMultiTenancy) 不一定是判断this表,因为在关联表查询中,有可能是Middle表是开启了租户,但是被引用的根表(例如User)没有开启租户,这时候还是要给租户条件 // 为了方便编码,我们认为只要配置文件启动了多租户,在传递条件时,我们就会赋予租户的参数 if (DomainDrivenConfiguration.Current.MultiTenancyConfig.IsEnabled) { param.Add(GeneratedField.TenantIdName, AppSession.TenantId); } }
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); } }
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)); } }
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); } }
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的方式加载 }
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; } }
/// <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); }
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); }
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; }
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); } } } }