أوتومابر العديد من تكوين خريطة واحدة
-
21-12-2019 - |
سؤال
أريد تعيين 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());
وأنا أقدر أن هذه الإجابة متأخرة جدا ، ولكن إذا قمت بتحديد العلاقة بين الكائنات الخاصة بك ، يمكنني مساعدتك في إنشاء تعيين أكثر تحديدا.