/// <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)); } } }
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); }