Mercurial > pub > bltoolkit
diff Extensions/JointureAddOn/Mapping/CollectionFullObjectMapper.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Extensions/JointureAddOn/Mapping/CollectionFullObjectMapper.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using BLToolkit.Data; +using BLToolkit.DataAccess; +using BLToolkit.Emit; + +namespace BLToolkit.Mapping +{ + public class CollectionFullObjectMapper : TableDescription, IObjectMapper + { + private readonly DbManager _db; + private readonly FactoryType _factoryType; + + public CollectionFullObjectMapper(DbManager db, FactoryType factoryType) + { + _db = db; + _factoryType = factoryType; + + PropertiesMapping = new List<IMapper>(); + PrimaryKeyValueGetters = new List<GetHandler>(); + PrimaryKeyNames = new List<string>(); + } + + public Type PropertyCollectionType { get; set; } + + #region IMapper Members + + public int DataReaderIndex { get; set; } + public SetHandler Setter { get; set; } + public Type PropertyType { get; set; } + public string PropertyName { get; set; } + + #endregion + + #region IObjectMapper + + public bool IsLazy { get; set; } + public bool ContainsLazyChild { get; set; } + public GetHandler Getter { get; set; } + + public List<GetHandler> PrimaryKeyValueGetters { get; set; } + public Association Association { get; set; } + + public List<string> PrimaryKeyNames { get; set; } + + #endregion + + #region ILazyMapper + + public GetHandler ParentKeyGetter { get; set; } + + #endregion + + public object CreateInstance() + { + object result = ContainsLazyChild + ? (_factoryType == FactoryType.LazyLoading + ? TypeFactory.LazyLoading.Create(PropertyType, this, LoadLazy) + : TypeFactory.LazyLoadingWithDataBinding.Create(PropertyType, this, LoadLazy)) + : FunctionFactory.Remote.CreateInstance(PropertyType); + + return result; + } + + private object LoadLazy(IMapper mapper, object proxy, Type parentType) + { + var lazyMapper = (ILazyMapper) mapper; + object key = lazyMapper.ParentKeyGetter(proxy); + + var fullSqlQuery = new FullSqlQuery(_db, true); + object parentLoadFull = fullSqlQuery.SelectByKey(parentType, key); + if (parentLoadFull == null) + { + object value = Activator.CreateInstance(mapper is CollectionFullObjectMapper + ? (mapper as CollectionFullObjectMapper).PropertyCollectionType + : mapper.PropertyType); + return value; + } + + var objectMapper = (IObjectMapper) mapper; + return objectMapper.Getter(parentLoadFull); + } + + #region IPropertiesMapping Members + + public List<IMapper> PropertiesMapping { get; private set; } + public IPropertiesMapping ParentMapping { get; set; } + + #endregion + } +} \ No newline at end of file