2016-07-11 3 views
15

ऑटोमैपर के नए संस्करण में नए 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(); 
+0

हो गया। मैंने यह दिखाने के लिए कुछ हद तक terse कोड जोड़ा कि मैं वर्तमान में ऑटोमैपर का उपयोग कैसे करता हूं। – PaddySe

उत्तर

5

आप IMemberValueResolver<object, object, string, bool> को लागू करके और अपने मैपिंग कॉन्फ़िगरेशन में इसका उपयोग करके एक अधिक सामान्य मूल्य रिज़ॉल्वर बना सकते हैं। आप पहले स्रोत स्रोत रिज़ॉल्यूशन फ़ंक्शन प्रदान कर सकते हैं:

public class PublicationSystemResolver : IMemberValueResolver<object, object, string, bool> 
{ 
    private readonly PublicationService _publicationService; 

    public PublicationSystemResolver(PublicationService publicationService) 
    { 
     this._publicationService = publicationService; 
    } 

    public bool Resolve(object source, object destination, string sourceMember, bool destMember, ResolutionContext context) 
    { 
     return _publicationService.IsInNewSystem(sourceMember); 
    } 
} 



cfg.CreateMap<FindCustomerServiceSellOffers, SalesPitchViewModel>() 
    .ForMember(dest => dest.IsInNewSystem, 
     src => src.ResolveUsing<PublicationSystemResolver, string>(s => s.PublicationCode)); 
+0

एक पूरी तरह से काम कर रहे डॉटनेटफिल्ड बनाने की कोशिश कर रहा है लेकिन यह ऑटोमैपर nuget पैकेज – Rhumborl

+0

पसंद नहीं है ओह शांत, उस इंटरफ़ेस को भी नहीं देखा। मैंने अपने सभी संकल्पकों पर आपके सुझावों को लागू किया है, लेकिन अब मुझे op_Equality के बारे में कुछ अजीब अपवाद है, और जब मुझे लगता है कि यह ऑटोमैपर को अपग्रेड करने से संबंधित है, तो शायद यह इस विशेष प्रश्न से संबंधित नहीं है। मदद के लिए आपका बहुत बहुत धन्यवाद!! – PaddySe

+0

@ रूंबोरल मैंने आपके उत्तर का सटीक वही काम किया लेकिन मेरा रिज़ॉल्यूवर क्लास ब्रेकपॉइंट द्वारा कभी नहीं मारा गया। कोई उपाय? यदि आप इसे देखना चाहते हैं तो मैं एक रेपो बना सकता हूं। धन्यवाद। – Robin

संबंधित मुद्दे