मैं StackOverflow पर AutoMapper सामान की तलाश कर रहा हूँ, मैं ValueInjecter के बारे में कुछ पढ़ रहा हूँ ।
क्या कोई मुझे उनके बीच के पेशेवरों और विपक्षों (प्रदर्शन, सुविधाएँ, एपीआई उपयोग, विस्तार, परीक्षण) के बारे में बता सकता है?
मैं StackOverflow पर AutoMapper सामान की तलाश कर रहा हूँ, मैं ValueInjecter के बारे में कुछ पढ़ रहा हूँ ।
क्या कोई मुझे उनके बीच के पेशेवरों और विपक्षों (प्रदर्शन, सुविधाएँ, एपीआई उपयोग, विस्तार, परीक्षण) के बारे में बता सकता है?
जवाबों:
ValueInjecter के निर्माता के रूप में , मैं आपको बता सकता हूं कि मैंने ऐसा इसलिए किया क्योंकि मैं कुछ सरल और बहुत लचीला चाहता था
मुझे वास्तव में बहुत लिखना या बहुत monkey code
पसंद करना पसंद नहीं है:
Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.
ValueInjecter यह प्लगइन्स के साथ मोज़िला की तरह कुछ है , आप ValueInjections बनाते हैं और उनका उपयोग करते हैं
वहाँ चपटे, unflattening, और कुछ है कि विरासत में मिला इरादा कर रहे हैं के लिए निर्मित इंजेक्शन हैं
और यह एक प्रकार के पहलू में अधिक काम करता है , आपको सभी गुण 1-से -1 निर्दिष्ट करने की आवश्यकता नहीं है, इसके बजाय आप कुछ ऐसा करते हैं:
"आईडी" नाम से समाप्त होने वाले स्रोत से सभी अंतर गुण लें, मान को परिवर्तित करें और प्रत्येक वस्तु को स्रोत वस्तु में ईद प्रत्यय के बिना एक ही नाम के साथ सेट करें और यह टाइप एंटिटी से विरासत में मिला है, जैसे सामान
तो एक स्पष्ट अंतर, ValueInjecter का उपयोग विंडोज़ के रूप में भी चपटा और अप्रभावित करने के लिए किया जाता है, यह कितना लचीला है
(नियंत्रण और वापस बनाने के लिए ऑब्जेक्ट से मैपिंग)
स्वचालित रूप से, विंडोज़ के रूप में उपयोग करने योग्य नहीं, कोई अप्रभावी नहीं है, लेकिन इसमें संग्रह मानचित्रण जैसी अच्छी सामग्री है, इसलिए यदि आपको इसकी आवश्यकता है तो ValueInjecter के साथ आपको कुछ ऐसा करना होगा:
foos.Select(o => new Bar().InjectFrom(o));
आप अनाम और गतिशील वस्तुओं से मैप करने के लिए ValueInjecter का भी उपयोग कर सकते हैं
मतभेद:
स्वचालित मैपिंग प्रत्येक मैपिंग की संभावना के लिए कॉन्फ़िगरेशन बनाएँ CreateMap ()
किसी भी वस्तु से किसी भी वस्तु के लिए इंजेक्टर इंजेक्टर (ऐसे भी मामले हैं जब आप ऑब्जेक्ट से वैल्यूएटाइप पर इंजेक्ट करते हैं)
आटोमैपर ने समतल बनाया है, और केवल सरल प्रकारों के लिए या उसी प्रकार से, और इसमें अप्रभावी नहीं है
valueinjecter आपको इसकी आवश्यकता केवल तभी जब आप करते हैं target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
और आप से चाहते हैं Foo.Bar.Name of type String
के लिए FooBarName of type Class1
आप FlatLoopValueInjection वारिस और यह निर्दिष्ट
ऑटोमैप्पर डिफ़ॉल्ट रूप से एक ही नाम के साथ गुणों को मैप करता है और बाकी के लिए आपको एक-एक करके निर्दिष्ट करना होगा, और Prop1.Ignore (), Prop2.Ignore () आदि जैसे सामान करना होगा।
valueinjecter में एक डिफ़ॉल्ट इंजेक्शन है। InjectFrom () जो एक ही नाम और प्रकार के साथ गुण करता है; बाकी सभी चीज़ों के लिए आप अलग-अलग मैपिंग लॉजिक / रूल्स के साथ अपने कस्टम वैल्यूएन्जेन्स बनाते हैं, जैसे पहलुओं को और अधिक, जैसे टाइप फू के सभी प्रॉप्स से लेकर टाइप बार के सभी प्रॉप्स को
<pedant>
अच्छा लग रहा है, लेकिन शायद यह ValueInjectOr होना चाहिए? </pedant>
चूंकि मैंने कभी किसी अन्य उपकरण का उपयोग नहीं किया है, इसलिए मैं केवल ऑटोमैपर के बारे में बात कर सकता हूं। ऑटोमैपर निर्माण के लिए मेरे मन में कुछ लक्ष्य थे:
अगर आप इन चीजों को करना चाहते हैं, तो AutoMapper आपके लिए बहुत अच्छा काम करता है। चीजें AutoMapper अच्छी तरह से नहीं कर रहे हैं:
कारण है कि मुझे इन चीजों को करने की कभी जरूरत नहीं पड़ी। अधिकांश भाग के लिए, हमारी इकाइयाँ बसती नहीं हैं, संग्रह को उजागर नहीं करती हैं, इत्यादि इसलिए यह नहीं है। हम संदेशों और इस तरह के आदेशों के लिए UI मॉडल से DTO और मैप करने के लिए ऑटोमैपर का उपयोग करते हैं। यही वह जगह है जहाँ यह वास्तव में हमारे लिए बहुत अच्छा काम करती है।
मैंने दोनों की कोशिश की और ValueInjecter को प्राथमिकता दी क्योंकि यह बहुत सरल है:
myObject.InjectFrom(otherObject);
यह सब मेरी इंजेक्शन की जरूरतों के विशाल बहुमत के लिए जानना है। यह संभवतः इससे अधिक सरल और सुरुचिपूर्ण नहीं हो सकता।
this object
विस्तार विधि?
InjectFrom()
विस्तार विधि को लागू करना है ।
यह एक ऐसा प्रश्न है जिस पर मैं शोध कर रहा हूं, और मेरे उपयोग के मामले के लिए, यह मूल्य-सूचक हाथ नीचे लगता है। इसका उपयोग करने के लिए किसी पूर्व सेटअप की आवश्यकता नहीं है (प्रदर्शन पर मेरे विचार से प्रभावित हो सकता है, हालाँकि यदि चालाकी से इसे लागू किया जाता है तो यह भविष्य के चालान के लिए मैपिंग को हर बार प्रतिबिंबित करने के बजाय कैश कर सकता है), इसलिए आपको उनका उपयोग करने से पहले किसी मैपिंग को पूर्वनिर्धारित करने की आवश्यकता नहीं है।
सबसे महत्वपूर्ण बात यह है कि यह रिवर्स मैपिंग की अनुमति देता है। अब मुझे यहाँ कुछ याद आ रहा है क्योंकि जिमी ने कहा कि उसे कोई उपयोग का मामला नहीं दिख रहा है जहाँ इसकी आवश्यकता है, इसलिए शायद मेरा पैटर्न गलत है, लेकिन मेरा उपयोग मामला यह है कि मैं अपने ORM से एक ViewModel ऑब्जेक्ट बना रहा हूँ। मैं इसे अपने वेबपेज पर प्रदर्शित करता हूं। एक बार जब उपयोगकर्ता समाप्त हो जाता है, तो मैं ViewModel को एक कैंपस के रूप में वापस प्राप्त करता हूं, यह मूल ORM कक्षाओं में वापस कैसे परिवर्तित होता है? मुझे ऑटोमैपर के साथ पैटर्न जानना अच्छा लगेगा। ValueInjector के साथ यह तुच्छ है, और यह अप्रभावित भी रहेगा। उदा। एक नई इकाई बनाना
Unitframework द्वारा बनाया गया मॉडल (पहले मॉडल):
public partial class Family
{
public int Id { get; set; }
public string FamilyName { get; set; }
public virtual Address Address { get; set; }
}
public partial class Address
{
public int Id { get; set; }
public string Line1 { get; set; }
public string Line2 { get; set; }
public string TownCity { get; set; }
public string County { get; set; }
public string Postcode { get; set; }
public virtual Family Family { get; set; }
}
ViewModel (जिसे मैं सत्यापनकर्ताओं के साथ सजा सकता हूं):
public class FamilyViewModel
{
public int Id { get; set; }
public string FamilyName { get; set; }
public int AddressId { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressTownCity { get; set; }
public string AddressCounty { get; set; }
public string AddressPostcode { get; set; }
}
ViewController:
//
// GET: /Family/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Family/Create
[HttpPost]
public ActionResult Create(FamilyViewModel familyViewModel)
{
try
{
Family family = new Family();
family.InjectFrom<UnflatLoopValueInjection>(familyViewModel);
db.Families.Add(family);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
मेरे दिमाग में, यह उससे ज्यादा सरल नहीं है?
(तो यह सवाल है, पैटर्न है कि मैं इस में चलाने के साथ क्या गलत है (और ऐसा लगता है कि कई अन्य करते हैं), कि यह AutoMapper के मूल्य के रूप में नहीं देखा है?)
हालाँकि, यदि यह पैटर्न डिस्क्राइब्ड है, तो क्या आप इसका उपयोग करना चाहते हैं, तो मेरा वोट देश मील के हिसाब से महत्वपूर्ण है।