コード例 #1
0
 /// <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);
     }
 }
コード例 #2
0
 /// <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;
 }
コード例 #3
0
        /// <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;
            }
        }
コード例 #4
0
 /// <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;
 }
コード例 #5
0
        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();
        }
コード例 #6
0
 /// <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);
コード例 #7
0
 /// <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));
 }
コード例 #8
0
 /// <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);
コード例 #9
0
        /// <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);
        }