/// <summary> /// Registro o registro para ser observado. /// </summary> /// <param name="typeName"></param> /// <param name="recordKey"></param> /// <param name="observer"></param> public void Register(Reflection.TypeName typeName, Query.RecordKey recordKey, Colosoft.Query.IRecordObserver observer) { if (IsEnabled && IsValidType(typeName)) { var typeNameEntry = GetTypeNameEntry(typeName); typeNameEntry.AddRecordKey(recordKey, observer); } }
/// <summary> /// Construtor padrão. /// </summary> /// <param name="dataModel"></param> /// <param name="recordKey"></param> /// <param name="children"></param> /// <param name="linkContainer"></param> /// <param name="references">Container das referências.</param> /// <param name="uiContext"></param> /// <param name="typeManager"></param> public EntityLoaderCreatorArgs(Data.IModel dataModel, Query.RecordKey recordKey, EntityLoaderChildContainer children, IEntityLoaderLinksContainer linkContainer, EntityLoaderReferenceContainer references, string uiContext, IEntityTypeManager typeManager) { _dataModel = dataModel; _recordKey = recordKey; _children = children; _links = linkContainer; _references = references; _uiContext = uiContext; _entityTypeManager = typeManager; }
/// <summary> /// Registra a instancia para ser observada. /// </summary> /// <param name="recordKey">Chave do registro que representa a instancia.</param> void IEntityRecordObserver.RegisterObserver(Query.RecordKey recordKey) { recordKey.Require("record").NotNull(); var manager = Colosoft.Query.RecordObserverManager.Instance; var modelType = ModelType; if (manager != null && manager.IsEnabled && ModelType != null) { if (_recordObserver != null) { UnregisterRecordObserver(); } var observer = CreateRecordObserver(); manager.Register(Colosoft.Reflection.TypeName.Get(modelType), recordKey, observer); _recordObserver = observer; } }
/// <summary> /// Construtor padrão. /// </summary> /// <param name="dataModel">Instancia do modelo de dados.</param> /// <param name="key">Chave do registro.</param> public DataModelRecordKey(Model dataModel, Query.RecordKey key) { _dataModel = dataModel; _key = key; }
internal void CreateQueries(Colosoft.Query.Queryable queryable, string uiContext, IEntityTypeManager entityTypeManager, Queue <Exception> exceptions, EntityLoaderExecuteQueryHandler callBack, Colosoft.Query.SubQueryFailedCallBack failedCallBack) { if (_entityLoader == null) { _entityLoader = entityTypeManager.GetLoader(EntityType); } var result = new List <EntityLoaderCreatorArgs>(); var query = queryable.BeginSubQuery((sender, e) => { List <IEntity> entities = null; try { var bindStrategy = _entityLoader.GetBindStrategy(); var objectCreator = _entityLoader.GetObjectCreator(); var recordKeyFactory = _entityLoader.GetRecordKeyFactory(); Colosoft.Reflection.TypeName dataModelTypeName = null; try { dataModelTypeName = Colosoft.Reflection.TypeName.Get(_entityLoader.DataModelType); } catch (Exception ex) { throw new Exception("An error ocurred when get DataModelType", ex); } result.Clear(); foreach (var record in e.Result) { var data = objectCreator.Create(); var bindResult = bindStrategy.Bind(record, Query.BindStrategyMode.All, ref data); if (!bindResult.Any()) { throw new Exception(string.Format("Not found scheme for bind record data to type '{0}'", data.GetType().FullName)); } Query.RecordKey recordKey = null; try { recordKey = recordKeyFactory.Create(dataModelTypeName, record); } catch (Exception ex) { throw new Exception("An error ocurred when create record key", ex); } result.Add(new EntityLoaderCreatorArgs((Data.IModel)data, recordKey, new EntityLoaderChildContainer(), new EntityLoaderLinksContainer(), new EntityLoaderReferenceContainer(), uiContext, entityTypeManager)); } entities = new List <IEntity>(); foreach (var i in result) { try { IEntity entity = null; LazyDataState lazyDataState = new LazyDataState(); _entityLoader.GetLazyData(i, lazyDataState, queryable.SourceContext, uiContext, entityTypeManager, exceptions); entity = _entityLoader.Create(uiContext, entityTypeManager, i, queryable.SourceContext); lazyDataState.Entity = entity; entities.Add(entity); i.Dispose(); } catch (Exception ex) { throw new AggregateException(ex.Message, exceptions); } } } catch (Exception ex) { failedCallBack(sender, new Query.SubQueryCallBackFailedArgs(e.Info, new Query.QueryFailedInfo(Query.QueryFailedReason.Error, ex.Message.GetFormatter(), ex))); return; } callBack(this, new EntityLoaderExecuteQueryEventArgs(DataModelType, EntityType, e.ReferenceValues, entities)); entities.Clear(); }, failedCallBack).From(new Query.EntityInfo(DataModelType.FullName)); var conditional = this.GetConditional(); if (conditional == null) { throw new InvalidOperationException("Conditional not found"); } query.Where(conditional.Expression); foreach (var i in conditional.Parameters) { query.Add(i.Name, i.Value); } _entityLoader.CreateNestedQueries(query, uiContext, entityTypeManager, result, exceptions); query.EndSubQuery(); }
/// <summary> /// Realiza a carda da entidade com carga tardia dos dados filhos. /// </summary> /// <param name="record">Registro dos dados da entidade.</param> /// <param name="recordKey">Chave do registro.</param> /// <param name="bindStrategy">Estratégia de vinculação dos dados do resultado.</param> /// <param name="objectCreator">Instancia responsável por criar objetos.</param> /// <param name="sourceContext">Contexto de origem dos dados.</param> /// <param name="uiContext">Contexto visual.</param> /// <param name="entityTypeManager">Instancia do gerenciador de tipos de entidades.</param> /// <param name="args">Argumentos que serão usados</param> /// <returns></returns> public abstract IEntity LazyLoad(Colosoft.Query.IRecord record, Query.RecordKey recordKey, Colosoft.Query.IQueryResultBindStrategy bindStrategy, Colosoft.Query.IQueryResultObjectCreator objectCreator, Colosoft.Query.ISourceContext sourceContext, string uiContext, IEntityTypeManager entityTypeManager, EntityLoaderLazyArgs args = null);
/// <summary> /// Realiza a carga da entidade com carga tardia dos dados filhos. /// </summary> /// <param name="record">Registro dos dados da entidade.</param> /// <param name="recordKey">Chave do registro.</param> /// <param name="sourceContext">Contexto de origem dos dados.</param> /// <param name="uiContext">Contexto visual.</param> /// <param name="entityTypeManager">Instancia do gerenciador de tipos de entidades.</param> /// <param name="args">Argumentos que serão usados</param> /// <returns></returns> public IEntity LazyLoad(Colosoft.Query.IRecord record, Query.RecordKey recordKey, Colosoft.Query.ISourceContext sourceContext, string uiContext, IEntityTypeManager entityTypeManager, EntityLoaderLazyArgs args = null) { return(LazyLoad(record, recordKey, GetBindStrategy(), GetObjectCreator(), sourceContext, uiContext, entityTypeManager, args)); }
/// <summary> /// Realiza a carga completa da entidade. /// </summary> /// <param name="record">Registro dos dados da entidade.</param> /// <param name="recordKey">Chave do registro.</param> /// <param name="bindStrategy">Estratégia de vinculação dos dados do resultado.</param> /// <param name="objectCreator">Instancia responsável por criar objetos.</param> /// <param name="sourceContext">Contexto de origem dos dados.</param> /// <param name="uiContext">Contexto visual.</param> /// <param name="entityTypeManager">Gerenciador de tipos.</param> /// <returns></returns> public abstract IEntity FullLoad(Colosoft.Query.IRecord record, Query.RecordKey recordKey, Colosoft.Query.IQueryResultBindStrategySession bindStrategy, Colosoft.Query.IQueryResultObjectCreator objectCreator, Colosoft.Query.ISourceContext sourceContext, string uiContext, IEntityTypeManager entityTypeManager);
/// <summary> /// Recupera o registrao associado com a ação. /// </summary> /// <param name="action">Instancia da ação de persistencia realizada.</param> /// <param name="record">Registro gerado.</param> /// <param name="recordKey">Chave do registro.</param> /// <returns>Nome do tipo associado.</returns> private Colosoft.Reflection.TypeName GetActionRecord(PersistenceAction action, out Query.Record record, out Query.RecordKey recordKey) { var typeName = new Reflection.TypeName(action.EntityFullName); var typeMetadata = TypeSchema.GetTypeMetadata(action.EntityFullName); var typeFields = GetRecordFields(action.EntityFullName, typeMetadata); var fields = new List <Query.Record.Field>(); var recordValues = new List <object>(); foreach (var actionParameter in action.Parameters) { var indexOf = 0; for (; indexOf < typeFields.Count; indexOf++) { if (typeFields[indexOf].Name == actionParameter.Name) { break; } } if (indexOf < typeFields.Count) { fields.Add(new Query.Record.Field(typeFields[indexOf].Name, typeFields[indexOf].Type)); recordValues.Add(actionParameter.Value); } } if (typeMetadata.IsVersioned && !fields.Any(f => f.Name == "RowVersion")) { fields.Add(new Query.Record.Field("RowVersion", typeof(long))); recordValues.Add(action.RowVersion); } var recordDescriptor = new Query.Record.RecordDescriptor("default", fields); record = recordDescriptor.CreateRecord(recordValues.ToArray()); recordKey = RecordKeyFactory.Create(typeName, record); return(typeName); }