using Ant.Mapper; using Ant.Descriptors; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using Ant.ORM; namespace Ant.Query.Mapping { public class MappingEntity : IObjectActivatorCreator { public MappingEntity(EntityConstructorDescriptor constructorDescriptor) { this.ConstructorDescriptor = constructorDescriptor; this.ConstructorParameters = new Dictionary(); this.ConstructorEntityParameters = new Dictionary(); this.Members = new Dictionary(); this.EntityMembers = new Dictionary(); } public int? CheckNullOrdinal { get; set; } public EntityConstructorDescriptor ConstructorDescriptor { get; private set; } public Dictionary ConstructorParameters { get; private set; } public Dictionary ConstructorEntityParameters { get; private set; } public Dictionary Members { get; private set; } public Dictionary EntityMembers { get; private set; } public IObjectActivator CreateObjectActivator() { return this.CreateObjectActivator(null); } /// /// /// /// /// public IObjectActivator CreateObjectActivator(AntORM dbContext) { EntityMemberMapper mapper = this.ConstructorDescriptor.GetEntityMemberMapper(); List memberSetters = new List(this.Members.Count + this.EntityMembers.Count); foreach (var kv in this.Members) { IMRM mMapper = mapper.GetMemberMapper(kv.Key); MappingMemberBinder binder = new MappingMemberBinder(mMapper, kv.Value); memberSetters.Add(binder); } foreach (var kv in this.EntityMembers) { Action del = mapper.GetNavigationMemberSetter(kv.Key); IObjectActivator memberActivtor = kv.Value.CreateObjectActivator(); NavigationMemberBinder binder = new NavigationMemberBinder(del, memberActivtor); memberSetters.Add(binder); } Func instanceCreator = this.ConstructorDescriptor.GetInstanceCreator(); List readerOrdinals = this.ConstructorParameters.Select(a => a.Value).ToList(); List objectActivators = this.ConstructorEntityParameters.Select(a => a.Value.CreateObjectActivator()).ToList(); ObjectActivator ret; if (dbContext != null) ret = new ObjectActivatorWithTracking(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal, dbContext); else ret = new ObjectActivator(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal); return ret; } } }