MappingEntity.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Ant.Mapper;
  2. using Ant.Descriptors;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Reflection;
  8. using Ant.ORM;
  9. namespace Ant.Query.Mapping
  10. {
  11. public class MappingEntity : IObjectActivatorCreator
  12. {
  13. public MappingEntity(EntityConstructorDescriptor constructorDescriptor)
  14. {
  15. this.ConstructorDescriptor = constructorDescriptor;
  16. this.ConstructorParameters = new Dictionary<ParameterInfo, int>();
  17. this.ConstructorEntityParameters = new Dictionary<ParameterInfo, IObjectActivatorCreator>();
  18. this.Members = new Dictionary<MemberInfo, int>();
  19. this.EntityMembers = new Dictionary<MemberInfo, IObjectActivatorCreator>();
  20. }
  21. public int? CheckNullOrdinal { get; set; }
  22. public EntityConstructorDescriptor ConstructorDescriptor { get; private set; }
  23. public Dictionary<ParameterInfo, int> ConstructorParameters { get; private set; }
  24. public Dictionary<ParameterInfo, IObjectActivatorCreator> ConstructorEntityParameters { get; private set; }
  25. public Dictionary<MemberInfo, int> Members { get; private set; }
  26. public Dictionary<MemberInfo, IObjectActivatorCreator> EntityMembers { get; private set; }
  27. public IObjectActivator CreateObjectActivator()
  28. {
  29. return this.CreateObjectActivator(null);
  30. }
  31. /// <summary>
  32. ///
  33. /// </summary>
  34. /// <param name="dbContext"></param>
  35. /// <returns></returns>
  36. public IObjectActivator CreateObjectActivator(AntORM dbContext)
  37. {
  38. EntityMemberMapper mapper = this.ConstructorDescriptor.GetEntityMemberMapper();
  39. List<IValueSetter> memberSetters = new List<IValueSetter>(this.Members.Count + this.EntityMembers.Count);
  40. foreach (var kv in this.Members)
  41. {
  42. IMRM mMapper = mapper.GetMemberMapper(kv.Key);
  43. MappingMemberBinder binder = new MappingMemberBinder(mMapper, kv.Value);
  44. memberSetters.Add(binder);
  45. }
  46. foreach (var kv in this.EntityMembers)
  47. {
  48. Action<object, object> del = mapper.GetNavigationMemberSetter(kv.Key);
  49. IObjectActivator memberActivtor = kv.Value.CreateObjectActivator();
  50. NavigationMemberBinder binder = new NavigationMemberBinder(del, memberActivtor);
  51. memberSetters.Add(binder);
  52. }
  53. Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> instanceCreator = this.ConstructorDescriptor.GetInstanceCreator();
  54. List<int> readerOrdinals = this.ConstructorParameters.Select(a => a.Value).ToList();
  55. List<IObjectActivator> objectActivators = this.ConstructorEntityParameters.Select(a => a.Value.CreateObjectActivator()).ToList();
  56. ObjectActivator ret;
  57. if (dbContext != null)
  58. ret = new ObjectActivatorWithTracking(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal, dbContext);
  59. else
  60. ret = new ObjectActivator(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal);
  61. return ret;
  62. }
  63. }
  64. }