Beispiel #1
0
        /// <summary>
        /// Cria a chave de registro da instancia.
        /// </summary>
        /// <param name="recordKeyFactory"></param>
        /// <returns></returns>
        public Query.RecordKey CreateRecordKey(Query.IRecordKeyFactory recordKeyFactory)
        {
            recordKeyFactory.Require("recordKeyFactory").NotNull();
            var typeName  = Colosoft.Reflection.TypeName.Get(GetType());
            var keyFields = recordKeyFactory.GetKeyFields(typeName).ToArray();

            if (keyFields.Length == 0)
            {
                return(new Query.RecordKey(string.Empty, 0));
            }
            var instanceType = GetType();
            var properties   = instanceType.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic).Where(f => f.CanRead && keyFields.Contains(f.Name));
            var fields       = new List <Query.Record.Field>();
            var values       = new List <object>();

            foreach (var property in properties)
            {
                if (CreateRecordIgnoreProperty(property.Name))
                {
                    continue;
                }
                fields.Add(new Query.Record.Field(property.Name, property.PropertyType));
                values.Add(property.GetValue(this, null));
            }
            var descriptor = new Query.Record.RecordDescriptor(instanceType.FullName, fields);

            return(recordKeyFactory.Create(typeName, descriptor.CreateRecord(values.ToArray())));
        }
Beispiel #2
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="typeSchema">Esquema dos tipos.</param>
 /// <param name="recordKeyFactory">Fabrica das chaves de registro.</param>
 public PersistenceActionResultProcessor(ITypeSchema typeSchema, Query.IRecordKeyFactory recordKeyFactory)
 {
     typeSchema.Require("typeSchema").NotNull();
     recordKeyFactory.Require("recordKeyFactory").NotNull();
     _typeSchema       = typeSchema;
     _recordKeyFactory = recordKeyFactory;
 }
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="databaseContext">Instancia do contexto do banco de dados.</param>
 /// <param name="cacheContext">Instancia do contexto do cache</param>
 /// <param name="typeSchema">Instancia dos esquemas dos tipos do sistema.</param>
 /// <param name="recordKeyFactory">Instancia da factory responsável pela criação das chaves de registro.</param>
 public DynamicPersistenceContext(IPersistenceContext databaseContext, IPersistenceContext cacheContext, Colosoft.Data.Schema.ITypeSchema typeSchema, Query.IRecordKeyFactory recordKeyFactory)
 {
     databaseContext.Require("databaseContext").NotNull();
     cacheContext.Require("cacheContext").NotNull();
     typeSchema.Require("typeSchema").NotNull();
     recordKeyFactory.Require("recordKeyFactory").NotNull();
     _databaseContext  = databaseContext;
     _cacheContext     = cacheContext;
     _typeSchema       = typeSchema;
     _recordKeyFactory = recordKeyFactory;
 }
Beispiel #4
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="databaseSession">Instancia da sessão de persistencia do banco de dados.</param>
 /// <param name="cacheSession">Instancia da sessão de persistencia do cache.</param>
 /// <param name="typeSchema">Instancia dos esquemas dos tipos do sistema.</param>
 /// <param name="recordKeyFactory">Instancia da factory responsável pela criação das chaves de registro.</param>
 public DynamicPersistenceSession(IPersistenceSession databaseSession, IPersistenceSession cacheSession, Colosoft.Data.Schema.ITypeSchema typeSchema, Query.IRecordKeyFactory recordKeyFactory)
 {
     databaseSession.Require("databaseSession").NotNull();
     cacheSession.Require("cacheSession").NotNull();
     typeSchema.Require("typeSchema").NotNull();
     recordKeyFactory.Require("recordKeyFactory").NotNull();
     _databaseSession        = databaseSession;
     _cacheSession           = cacheSession;
     _typeSchema             = typeSchema;
     _recordKeyFactory       = recordKeyFactory;
     _defaultExecuterCreator = ((IPersistenceExecuterFactory)_databaseSession).ExecuterCreator;
     ((IPersistenceExecuterFactory)_databaseSession).ExecuterCreator = CreateExecuter;
 }
        /// <summary>
        /// Realiza os bind dos dados do registro informado.
        /// </summary>
        /// <param name="record">Registro contendo os dados.</param>
        /// <param name="mode"></param>
        /// <param name="recordKeyFactory">Factory responsável pela geração da chave do registro.</param>
        /// <param name="instance"></param>
        /// <returns></returns>
        private IEnumerable <string> Bind(Query.IRecord record, Query.BindStrategyMode mode, Query.IRecordKeyFactory recordKeyFactory, ref object instance)
        {
            record.Require("record").NotNull();
            var descriptor = instance as IEntityDescriptor;

            if (descriptor == null)
            {
                return(new string[0]);
            }
            var    idFieldIndex          = record.Descriptor.GetFieldPosition(_entityLoader.UidPropertyName);
            var    descriptionFieldIndex = record.Descriptor.GetFieldPosition(_entityLoader.DescriptionPropertyName);
            string nameFieldValue        = string.Empty;

            if (_entityLoader.FindNameProperties.Count() > 1)
            {
                var info = Merge(_entityLoader.FindNameProperties, descriptor, record).ToArray();
                if (info.Length == 0 && mode == Query.BindStrategyMode.Differences)
                {
                    nameFieldValue = descriptor.Name;
                }
                else
                {
                    nameFieldValue = _entityLoader.FindNameConverter.Convert(info);
                }
            }
            else
            {
                var nameFieldIndex = record.Descriptor.GetFieldPosition(_entityLoader.FindNameProperties.FirstOrDefault());
                if (nameFieldIndex >= 0)
                {
                    nameFieldValue = record[nameFieldIndex];
                }
                else if (mode == Query.BindStrategyMode.Differences)
                {
                    nameFieldValue = descriptor.Name;
                }
            }
            descriptor.Id          = idFieldIndex >= 0 ? record[idFieldIndex] : mode == Query.BindStrategyMode.Differences ? descriptor.Id : 0;
            descriptor.Name        = nameFieldValue;
            descriptor.Description = descriptionFieldIndex >= 0 ? record[descriptionFieldIndex] : mode == Query.BindStrategyMode.Differences ? descriptor.Description : string.Empty;
            if (record.Descriptor.Contains("ActivatedDate") && record.Descriptor.Contains("ExpiredDate"))
            {
                DateTimeOffset activatedDate = record["ActivatedDate"];
                DateTimeOffset?expiredDate   = record["ExpiredDate"];
                var            isActive      = activatedDate < ServerData.GetDateTimeOffSet() && !(expiredDate.HasValue && (ServerData.GetDateTimeOffSet() > expiredDate));
                var            isExpired     = expiredDate.HasValue && (ServerData.GetDateTimeOffSet() > expiredDate);
                descriptor.ConfigureStatusControl(isActive, isExpired);
            }
            if (descriptor is BusinessEntityDescriptor)
            {
                var businessDescritor = (BusinessEntityDescriptor)descriptor;
                businessDescritor.RecordKey = recordKeyFactory.Create(_entityLoader.DataModelTypeName, record);
            }
            var changedProperties = new List <string> {
                "Id",
                "Name",
                "Description",
                "IsActive",
                "IsExpired"
            };

            if (descriptor is IBindableEntityDescriptor)
            {
                changedProperties = changedProperties.Union(((IBindableEntityDescriptor)descriptor).Bind(record, mode)).ToList();
            }
            return(changedProperties.ToArray());
        }
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="databaseExecuter">Executor do banco de dados.</param>
 /// <param name="cacheExecuter">Executor do cache.</param>
 /// <param name="cacheProvider"></param>
 /// <param name="typeSchema"></param>
 /// <param name="recordKeyFactory"></param>
 public DynamicPersistenceExecuter(IPersistenceExecuter databaseExecuter, IPersistenceExecuter cacheExecuter, Colosoft.Caching.ICacheProvider cacheProvider, Colosoft.Data.Schema.ITypeSchema typeSchema, Query.IRecordKeyFactory recordKeyFactory)
 {
     _databaseExecuter      = databaseExecuter;
     _cacheExecuter         = cacheExecuter;
     _cacheProvider         = cacheProvider;
     _typeSchema            = typeSchema;
     _actionResultProcessor = new Schema.PersistenceActionResultProcessor(typeSchema, recordKeyFactory);
 }