ऑटोमैपर के नए संस्करण में नए IValueResolver
इंटरफ़ेस का उपयोग करने के तरीके के रूप में मुझे नुकसान हुआ है। शायद मैंने उन्हें ऑटोमैपर के पिछले संस्करणों में अनुचित रूप से उपयोग किया ...ऑटोमैपर के नए IValueResolver का उपयोग कैसे करें?
मेरे पास बहुत सारे मॉडल वर्ग हैं, उनमें से कुछ SQL डेटाबेस का उपयोग करते हुए कई डेटाबेस सर्वरों पर कई डेटाबेस से उत्पन्न होते हैं।
इनमें से कुछ वर्गों में एक स्ट्रिंग प्रॉपर्टी है, PublicationCode
, जो सदस्यता, या ऑफ़र, या चालान, या जो भी हो, का प्रकाशन करता है, से संबंधित है।
प्रकाशन दो प्रणालियों (पुराने और नई प्रणाली) में मौजूद हो सकता है, इसलिए मेरे पास गंतव्य मॉडल कक्षाओं पर एक बूल संपत्ति है जो बताती है कि प्रकाशन पुराने या नए सिस्टम में है या नहीं।
AutoMapper के पुराने संस्करण (< 5?) का उपयोग करना, मैं एक ValueResolver<string, bool>
जो एक इनपुट पैरामीटर के रूप में PublicationCode
ले लिया करता था, और एक bool
लौटे प्रकाशन (पुराने या नए सिस्टम) के स्थान का संकेत है।
ऑटोमैपर के नए संस्करण (5+?) के साथ, ऐसा अब संभव नहीं है। नए IValueResolver के पास मेरे पास स्रोत और गंतव्य मॉडल के प्रत्येक संयोजन के अद्वितीय कार्यान्वयन की आवश्यकता है, जहां src.PublicationCode
को dst.IsInNewSystem
में हल करने की आवश्यकता है।
क्या मैं सिर्फ गलत तरीके से मूल्य रिज़ॉल्यूशन का उपयोग करने की कोशिश कर रहा हूं? क्या कोई बेहतर तरीका है? मुख्य कारण यह है कि मैं एक रिज़ॉल्यूवर का उपयोग करना चाहता हूं कि मैं कन्स्ट्रक्टर में इंजेक्शन वाली सेवाओं को पसंद करता हूं, और DependencyResolver
और कोड की तरह (मैं ऑटोफैक का उपयोग कर रहा हूं) का उपयोग नहीं करना चाहता हूं।
वर्तमान में, मैं इसे निम्नलिखित तरीके से उपयोग करें:
// Class from Linq-to-SQL, non-related properties removed.
public class FindCustomerServiceSellOffers {
public string PublicationCode { get; set; }
}
यह जो एक PublicationCode संपत्ति शामिल है) कई डाटा मॉडल वर्गों मेरे पास है, में से एक है। यह विशेष रूप से वर्ग इस दृश्य मॉडल के लिए मैप किया गया है:
public class SalesPitchViewModel {
public bool IsInNewSystem { get; set; }
}
इन दो वर्गों के लिए मानचित्रण परिभाषा है (जहां अभिव्यक्ति एक IProfileExpression है), गैर संबंधित मैपिंग हटाया:
expression.CreateMap<FindCustomerServiceSellOffers, SalesPitchViewModel>()
.ForMember(d => d.IsInNewSystem, o => o.ResolveUsing<PublicationSystemResolver>().FromMember(s => s.PublicationCode));
और समाधानकर्ता:
public class PublicationSystemResolver : ValueResolver<string, bool>
{
private readonly PublicationService _publicationService;
public PublicationSystemResolver(PublicationService publicationService)
{
_publicationService = publicationService;
}
protected override bool ResolveCore(string publicationCode)
{
return _publicationService.IsInNewSystem(publicationCode);
}
}
और नक्शाकार के उपयोग:
var result = context.FindCustomerServiceSellOffers.Where(o => someCriteria).Select(_mapper.Map<SalesPitchViewModel>).ToList();
हो गया। मैंने यह दिखाने के लिए कुछ हद तक terse कोड जोड़ा कि मैं वर्तमान में ऑटोमैपर का उपयोग कैसे करता हूं। – PaddySe