سؤال

أريد تعيين 3 فئات مختلفة في دتو واحد ، كل خاصية لها نفس الاسم على المصدر والوجهة ، والطبقات هي التالية:

  • المستخدم
  • المرشح
  • محفظة

هذا هو دتو وكيف أريد أن خريطة الكائنات بلدي:

public class CandidateTextInfo
    {
        public string ProfilePicture { get; set; }   //-->User
        public ObjectId UserId { get; set; }         //-->User
        public string Name { get; set; }             //--> Candidate
        public string Headline { get; set; }         //--> Candidate
        public Gender Gender { get; set; }           //--> Candidate
        public byte Rating { get; set; }             //--> Candidate
        public bool IsCompany { get; set; }          //--> Candidate
        public string[] Tags { get; set; }           //--> Portafolio
        public string[] Categories { get; set; }     //--> Portafolio
        public string ExecutiveSummary { get; set; } //--> Portafolio
        public HourlyRate HourlyRate{ get; set; }    //--> Candidate
    }

لقد كنت أبحث في ذلك ووجدت هذا الحل ولكني لا أحصل على الطريقة البناء

فكيف يمكنني أن أفعل أن يكون العديد من لرسم الخرائط واحد, هل هذا ممكن, إن لم يكن أي حل?

هل كانت مفيدة؟

المحلول

Incompater Suitcesing مفيد لبناء خاصية واحدة من رمز مخصص.في حالتك ليست ضرورية حقا.تحتاج فقط إلى إنشاء خرائط من الكائنات الخاصة بك إلى DTO الخاص بك.ثم قم بتعيين كل مثيل كائن لنفس مثيل DTTO.

ولكن لأن Automapper يريد تعريف كل خاصية لكائن الوجهة لضمان تحديد الوجهة بالكامل، ستحتاج إلى تكوين كل تعيين مع الخصائص غير الموجودة في الكائن المصدر كما تم تجاهل

giveacodicetagpre.

إذا كان هذا رمز غنيمة كبير جدا، فسيتم استكشاف العديد من الحلول على تجاوز سعة المكدس، من بينها هذا واحد يبدو ويعزينا: Automapper:" تجاهل الباقي "؟ (انظر إلى إجابة روبرت شرودر)

نصائح أخرى

يعتمد ذلك بشكل كبير على العلاقات بين الأشياء الخاصة بك.إذا كانت لديك علاقة 1: 1 بين الأشياء الخاصة بك (على سبيل المثال.إذا User لديه خصائص User.Candidate و User.Portfolio) ثم رسم الخرائط سهل:-

CreateMap<User, CandidateTextInfo>()
  .ForMember(d => d.ProfilePicture, o => o.MapFrom(s => s.ProfilePicture)
  // ...
  .ForMember(d => d.Name, o => o.MapFrom(s => s.Candidate.Name)
  // And so on...

إذا لم يكن لديك تعيين واحد لواحد ، فأنت بحاجة إلى ترتيب الأشياء بنفسك قليلا:-

public class CandidateTextInfoSource
{
  public CandidateTextInfoSource(User user,
                                 Candidate candidate,
                                 Portafolio portafolio)
  {
    this.User = user;
    this.Candidate = candidate;
    this.Portafolio = portafolio;
  }

  public User User { get; set; }
  public Candidate Candidate { get; set; }
  public Portafolio Portafolio { get; set; }
}

// ...

CreateMap<CandidateTextInfoSource, CandidateTextInfo>()
  .ForMember(d => d.ProfilePicture, o => o.MapFrom(s => s.User.ProfilePicture)
   // ...
  .ForMember(d => d.Name, o => o.MapFrom(s => s.Candidate.Name)
   // And so on...

يمكنك بعد ذلك استخدام أي وسيلة تحتاجها لإنشاء CandidateTextInfoSource اعتمادا على العلاقة بين الأشياء الخاصة بك.على سبيل المثال ، إذا افترضت أن User لديه مجموعة User.Candidates, ، و أ Candidate لديه خاصية Candidate.Portfolio:-

CreateMap<User, IEnuemerable<CandidateTextInfoSource>>()
  .ConstructUsing(
    x => x.Candidates
          .Select(y => Mapper.Map<CandidateTextInfo>(new CandidateTextInfoSource(x, y, y.Portfolio)))
  .ToList());

وأنا أقدر أن هذه الإجابة متأخرة جدا ، ولكن إذا قمت بتحديد العلاقة بين الكائنات الخاصة بك ، يمكنني مساعدتك في إنشاء تعيين أكثر تحديدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top