Ejemplo n.º 1
0
 /// <summary>
 /// Recupera o item do cache.
 /// </summary>
 /// <param name="type"></param>
 /// <param name="creatorLoader"></param>
 /// <returns>Posição do mapeamento no vetor</returns>
 public static TypeBindStrategy GetItem(Type type, Func <Type, IQueryResultObjectCreator> creatorLoader)
 {
     type.Require("type").NotNull();
     lock (_objLock)
     {
         if (_items == null)
         {
             _itemsAccessCount = new int[_size];
             _itemsTypeNames   = new string[_size];
             _items            = new TypeBindStrategy[_size];
             for (int i = 0; i < _itemsAccessCount.Length; i++)
             {
                 _itemsAccessCount[i] = -1;
             }
         }
         int pos = -1;
         for (int i = 0; i < _itemsTypeNames.Length; i++)
         {
             if (_itemsTypeNames[i] != null && _itemsTypeNames[i] == type.FullName)
             {
                 _itemsAccessCount[i]++;
                 pos = i;
             }
             else
             {
                 if (_itemsAccessCount[i] > int.MinValue)
                 {
                     _itemsAccessCount[i]--;
                 }
             }
         }
         if (pos >= 0)
         {
             return(_items[pos]);
         }
         pos = 0;
         for (int i = 1; i < _itemsAccessCount.Length; i++)
         {
             if (_itemsAccessCount[i] < _itemsAccessCount[pos])
             {
                 pos = i;
             }
         }
         if (pos != -1 && _items[pos] != null)
         {
             System.Diagnostics.Debug.WriteLine("TYPE.BINDING.STRATEGY.CACHE FREE POSITION: " + pos + "; TYPE: " + _items[pos].Type.FullName);
             _items[pos] = null;
         }
         var instance = new TypeBindStrategy(type, creatorLoader == null ? null : creatorLoader(type));
         _itemsAccessCount[pos] = 10;
         _itemsTypeNames[pos]   = type.FullName;
         _items[pos]            = instance;
         return(instance);
     }
 }
        /// <summary>
        /// Construtor padrão.
        /// </summary>
        /// <param name="typeBindStrategy">Instancia da estratégia de vinculação associada.</param>
        /// <param name="descriptor"></param>
        public TypeBindRecordDescriptorSchema(TypeBindStrategy typeBindStrategy, Record.RecordDescriptor descriptor)
        {
            _properties = new List <Property>();
            var typeProperties = typeBindStrategy.Type.GetProperties(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
            var stringComparer = StringComparer.InvariantCultureIgnoreCase;

            foreach (var field in descriptor)
            {
                var prop = typeProperties.Where(f => f.CanWrite && stringComparer.Equals(f.Name, field.Name)).FirstOrDefault();
                if (prop != null)
                {
                    if (_properties.Exists(f => stringComparer.Equals(f.FieldName, field.Name)))
                    {
                        throw new TypeBindStrategyException(ResourceMessageFormatter.Create(() => Properties.Resources.TypeBindStrategy_DuplicateFieldName, field.Name, typeBindStrategy.Type.FullName, string.Join(", ", descriptor.Select(f => f.Name).ToArray())).Format());
                    }
                    var converter = System.ComponentModel.TypeDescriptor.GetConverter(prop.PropertyType);
                    _properties.Add(new Property(field.Name, prop, converter));
                }
            }
        }
Ejemplo n.º 3
0
 public MultiQueryable Add <TModel>(Queryable query, QueryCallBack <TModel> callback, QueryFailedCallBack failedCallBack, IQueryResultBindStrategy bindStrategy, IQueryResultObjectCreator objectCreator)
 {
     _queries.Add(query);
     if (bindStrategy == null && objectCreator == null)
     {
         var ts = TypeBindStrategyCache.GetItem(typeof(TModel), t => new QueryResultObjectCreator(t));
         objectCreator = ts;
         bindStrategy  = ts;
     }
     if (bindStrategy == null)
     {
         bindStrategy = new TypeBindStrategy(typeof(TModel), objectCreator);
     }
     if (callback != null)
     {
         QueryCallBackWrapper <TModel> wrapper = new QueryCallBackWrapper <TModel>();
         wrapper.QueryCallBack       = callback;
         wrapper.QueryFailedCallBack = failedCallBack;
         wrapper.BindStrategy        = bindStrategy;
         wrapper.ObjectCreator       = objectCreator;
         _callbacks.Add(_queries.Count - 1, wrapper);
     }
     return(this);
 }