2009-04-23 12 views
8

मैं एमवीवीएम पैटर्न का उपयोग कर एक डब्ल्यूपीएफ एप्लीकेशन बना रहा हूं। हमारे ढेर इस तरह दिखता है:इकाई फ्रेमवर्क + पीओसीओ

एसक्यूएल सर्वर 2008 -> इकाई की रूपरेखा

हम निर्भरता इंजेक्शन के लिए StructureMap का उपयोग हमारे DataFactory जो अनिवार्य रूप से हमारे POCO व्यापार वस्तुओं के लिए CRUD करता इंजेक्षन करने के लिए।

व्यूमोडल्स सीआरयूडी के लिए डेटाफैक्टरी का उपयोग करते हैं और एक्सएएमएल पीओसीओ में गुणों के लिए डेटा बाध्य है।

पूरी चीज बहुत अच्छी तरह से काम करती है, लेकिन एकमात्र चीज जो मुझे कुछ परेशानी होती है वह डेटा फैक्ट्री में होती है। हम प्रत्येक संपत्ति को ईएफ ऑब्जेक्ट से पीओसीओ में चुनते हैं और अपडेट/डालने पर रिवर्स कॉपी करते हैं।

क्या इस प्रक्रिया को स्वचालित करने का कोई तरीका है जैसे Fluent NHibernate के लिए करता है लेकिन इकाई फ्रेमवर्क के साथ करता है?

public void InsertCustomer(ref Manager.Model.Customer businessObject) 
{ 
    var mgr = new Manager.Data.PersonData.PersonContext(); 

    var person = new Manager.Data.PersonData.Person(); 
    var customer = new Manager.Data.PersonData.Customer(); 

    customer.Comments = businessObject.Comments; 
    customer.Company = businessObject.Company; 
    customer.IsBusiness = businessObject.IsBusiness; 
    customer.IsCompleted = businessObject.IsCompleted; 
    customer.ModifiedBy = "someone"; 
    customer.ModifiedOn = DateTime.Now; 
    customer.CreatedBy = "someone"; 
    customer.CreatedOn = DateTime.Now; 

    person.Customer.Add(customer); 
    person.FirstName = businessObject.FirstName; 
    person.LastName = businessObject.LastName; 
    person.Birthday = businessObject.Birthday; 
    person.CreatedBy = "someone"; 
    person.CreatedOn = DateTime.Now; 
    person.Gender = businessObject.Gender; 
    person.MiddleInitial = businessObject.MiddleInitial; 
    person.ModifiedBy = "someone"; 
    person.ModifiedOn = DateTime.Now; 
    person.Nickname = businessObject.Nickname; 
    person.Picture = ""; 
    person.Suffix = businessObject.Suffix; 
    person.Title = businessObject.Title; 

    mgr.AddToPeople(person); 
    mgr.SaveChanges(); 
} 

यह कुछ वर्ग घोषित करने के लिए सुविज्ञ यह होता है की तरह अच्छा होगा:

यहाँ डेटा कारखाने में एक नमूना डालने विधि है

public class CatMap : ClassMap<Cat> 
{ 
    public CatMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name) 
     .WithLengthOf(16) 
     .Not.Nullable(); 
    Map(x => x.Sex); 
    References(x => x.Mate); 
    HasMany(x => x.Kittens); 
    } 
} 

अंत में मेरी डालने विधि कैसा लगेगा यह:

public void InsertCustomer(ref Manager.Model.Customer businessObject) 
{ 
    var mgr = new Manager.Data.PersonData.PersonContext(); 

    var person = new Manager.Data.PersonData.Person(); 
    var customer = new Manager.Data.PersonData.Customer(); 

    Something.Map(person, businessObject); 
    Something.Map(customer, businessObject); 

    person.Customer.Add(customer); 

    mgr.AddToPeople(newCustomer); 
    mgr.SaveChanges(); 
} 

अनिवार्य रूप से मैं व्यापार obj से डेटा स्थानांतरित करने के लिए कोड को खत्म कर दूंगा इकाई फ्रेम कार्य ऑब्जेक्ट के लिए ect यह मैपिंग कक्षा में एक बार किया जाएगा और प्रत्येक विधि के लिए दोहराना नहीं होगा।

धन्यवाद!

+0

कुछ कोड कृपया? – chakrit

उत्तर

1

हालांकि मुझे डेटा मैपर के बारे में पता नहीं है जो आप ईएफ के लिए चाहते हैं, यह लिखना मुश्किल नहीं है। मैपिंग को परिभाषित करने के बाद भी अधिकांश काम है, यह आपके द्वारा सूचीबद्ध फ्लेंट इंटरफ़ेस मैपिंग का उपयोग करने से वास्तव में कठिन नहीं है। आप केवल एक मैपर क्लास बनाते हैं जिसमें कई मानचित्र फ़ंक्शन हैं, जिनमें से प्रत्येक में आपके मैपिंग तर्क शामिल हैं।

एक विचार यह है कि दिलचस्प हो सकता है कि आपके मानचित्र फ़ंक्शन एक्सटेंशन विधियां बनाएं। आप अभी भी एक मैपर वर्ग पैदा करेगा, लेकिन नक्शे तरीकों में से प्रत्येक की तरह

public static Person MapToPerson(this Manager.Model.Customer bizObject) 
    { 
     Person person = new Person(); 
     // mapping logic 
     return person; 
    } 

लगेगा के बाद से MapToPerson विधि एक विस्तार विधि वास्तव में अपने bizObject वर्ग पर एक विधि है, तो आप POCO तोड़ने नहीं कर रहे है, और नहीं । लेकिन, विस्तार विधि का वाक्यात्मक चीनी की वजह से, अपने InsertCustomer विधि कोड इस तरह हो सकता है:

Customer customer = bizObject.MapToCustomer(); 
    Person person = bizObject.MapToPerson(); 
संबंधित मुद्दे