2015-09-28 6 views
5

मैं एक बहुपरती आवेदन बना रहा हूं, उच्चतम परत के रूप में एक asp.net MVC आवेदन कर रहे हैं।एएसपी.नेट एमवीसी बहुआयामी अनुप्रयोग: ऑटोमैपर प्रारंभिक स्थान कहां रखा जाए?

प्रस्तुति परत ---> सेवा लेयर ---> व्यवसाय परत ----> डेटा एक्सेस परत ----> डेटाबेस:

वास्तुकला निम्नलिखित (---> का मतलब संदर्भ) है

इसके अलावा, वहाँ एक परत "Infrastracture" जो सभी परतों द्वारा संदर्भित है कहा जाता है।

प्रत्येक परत अपने आप इकाइयां हैं। उदाहरण के लिए: प्रस्तुति परत में हमारे पास सेवा परत UserDTO में, व्यापार परत UserBDO में और अंत में, डेटा एक्सेस लेयर, उपयोगकर्ता में UserViewModel हो सकता है।

automapper विभिन्न प्रकार के बीच रूपांतरण को स्वचालित करने के लिए किया जाता है।

मैंने पढ़ा है कि कुछ डेवलपर्स ग्लोबल.एक्सएक्स में मैपिंग सृजन रखने का सुझाव देते हैं, लेकिन यह स्पष्ट है कि यदि आपके पास बहुआयामी अनुप्रयोग है तो आप वहां सभी मैपिंग नहीं बना सकते हैं। आप प्रस्तुति परत में उपयोगकर्ता बीडीओ के साथ उपयोगकर्ता को मैप नहीं कर सकते हैं।

तो, मैं एक multilayred आवेदन में मानचित्रण केंद्रीकरण का प्रबंधन करने के स्पष्ट तरीका पूछ रहा हूँ। आप आर्किटेक्चर में बदलावों का भी सुझाव दे सकते हैं।

+0

क्या आपके पास उपयोगिता या ढांचे जैसी कोई परत है, तो आप एक ऐसे फ़ंक्शन का पर्दाफाश कर सकते हैं जो सेटीटीपीई और टोटीपीई टाइप कर सकता है और – Rex

+0

को परिवर्तित कर सकता है। आपको एक यूटिलिटी प्रोजेक्ट या ऐसा कुछ चाहिए। आप अपने enums (नामकरण) कहां रखते हैं? –

+0

@ वाइनरी सिंह तो, क्या आप वास्तुकला को बदलने का सुझाव दे रहे हैं? व्यापार परत सभी प्रकारों का संदर्भ नहीं दे सकती है, लेकिन केवल उपयोगकर्ता बीडीओ और उपयोगकर्ता। यह UserDTO और UserViewModel नहीं जानता है। –

उत्तर

1

मैं सुझाव है कि आप पहले से ही उत्तर है - अगर आप एक ही स्थान पर अपने सभी प्रकार का उपयोग cann't - बस कई भागों में मानचित्रण विन्यास अलग हो गए। यह समाधान बड़ी परियोजनाओं में अधिक रखरखाव योग्य है (बस एक विन्यास में 100 या 1000 मैपिंग की कल्पना करें)। उदाहरण के लिए, हम कस्टम डीटीओ को तीसरे पक्ष के डब्ल्यूसीएफ अनुबंधों को परिवर्तित करने के लिए विशिष्ट मैपर का उपयोग करते हैं। यह मैपर अलग परियोजना में डब्ल्यूसीएफ क्लाइंट के साथ मिलकर स्थित है। तो अनुबंध और मैपिंग बाहर से उपलब्ध नहीं हैं।

+0

तो, क्या आप कक्षा के निर्माता में मैपिंग को कॉल करते हैं जो एक प्रकार को दूसरे में परिवर्तित करेगा? या क्या आपके पास एक अलग दृष्टिकोण है? –

+0

हां, हम सीधे 'मैपर' विधियों को कॉल नहीं करते हैं। इसके बजाय एक वर्ग-रैपर का उपयोग अपनी 'मानचित्र' विधि ('Mapper.Map' के लिए सरल रैपर) के साथ किया जाता है। इस वर्ग में एक स्थिर कन्स्ट्रक्टर भी है जिसमें 'Mapper.CreateMap' कॉल शामिल हैं (इसलिए हम सुनिश्चित करते हैं कि कॉन्फ़िगरेशन' Mapper.Map' कॉल से पहले बनाया गया है, और यह केवल 1 बार बनाया गया है)। –

+0

क्या आपको इन सभी परतों की आवश्यकता है? केवल संस्थाओं और अपने एमवीसी दृश्य मॉडल/मॉडल के साथ सरल शुरू करने का प्रयास करें। इसके बजाय नामस्थानों का उपयोग करने के लिए फ़ोल्डर्स में अपनी परियोजनाओं को ध्वस्त करने का प्रयास करें। क्या आप ऐसा करके कुछ भी सार्थक खो देते हैं। ग्रीनफील्ड प्रोजेक्ट में ऑटोमैपर का उपयोग करना आम तौर पर एक संकेत है जो चीजें पहले से ही जटिल हैं। डब्ल्यूसीएफ सेवा के संदर्भ में – DalSoft

0

मैं अपने स्वयं के प्रश्न का उत्तर देने का प्रयास करता हूं: अगर आपको कुछ भी अच्छा नहीं लगता है तो मुझे सही करने के लिए स्वतंत्र महसूस करें।

मैं इन शब्दों का उपयोग करेंगे:

  • परत: इस संदर्भ में एक परत खड़ी अर्थ में आवेदन की एक मॉड्यूल है (डेटाबेस से यूजर इंटरफेस के लिए)

  • मॉड्यूल : क्षैतिज अर्थों में अपने आवेदन के एक क्षेत्र है, उदाहरण के "सीआरएम", "उत्पाद" के लिए, लेखा ", ... हर एक होने यह विभिन्न परतों में कोड है

तो यो। आपके पास एन परतों और एन मॉड्यूल में विभाजित एक अनुप्रयोग है, follwing एक विशेष मॉड्यूल और परत के एक विशिष्ट वर्ग के लिए एक उदाहरण हो सकता है।

public static class ProductMapper 
{ 
    static ProductMapper() 
    { 
     MapProductBDOToDTO(); 
     MapProductDTOToBDO(); 

     MapProductCategoryBDOToDTO(); 
     MapProductCategoryDTOToBDO(); 

     MapIvaBDOToDTO(); 
     MapIvaDTOToBDO(); 

     MapProductSupplierBDOToDTO(); 
     MapProductSupplierDTOToBDO(); 

     MapProductPictureBDOToDTO(); 
     MapProductPictureDTOToBDO(); 

     MapProductNoteBDOToDTO(); 
     MapProductNoteDTOToBDO(); 

     MapStockProductBDOToDTO(); 
     MapStockProductDTOToBDO(); 

     MapTagBDOToDTO(); 
     MapTagDTOToBDO(); 
    } 


    public static TTargetType Convert<TToConvert, TTargetType>(TToConvert toConvert) 
    { 
     return Mapper.Map<TTargetType>(toConvert); 
    } 


    private static void MapProductDTOToBDO() 
    { 
     Mapper.CreateMap<ProductDTO, ProductBDO>(); 
    } 

    private static void MapProductBDOToDTO() 
    { 
     Mapper.CreateMap<ProductDTO, ProductBDO>().ReverseMap(); 
    } 

    private static void MapProductCategoryDTOToBDO() 
    { 
     Mapper.CreateMap<ProductCategoryDTO, ProductCategoryBDO>(); 
    } 

    private static void MapProductCategoryBDOToDTO() 
    { 
     Mapper.CreateMap<ProductCategoryBDO, ProductCategoryDTO>(); 
    } 

    private static void MapIvaDTOToBDO() 
    { 
     Mapper.CreateMap<IvaDTO, IvaBDO>(); 
    } 

    private static void MapIvaBDOToDTO() 
    { 
     Mapper.CreateMap<IvaBDO, IvaDTO>(); 
    } 

    private static void MapProductSupplierDTOToBDO() 
    { 
     Mapper.CreateMap<ProductSupplierDTO, ProductSupplierBDO>(); 
    } 

    private static void MapProductSupplierBDOToDTO() 
    { 
     Mapper.CreateMap<ProductSupplierDTO, ProductSupplierBDO>().ReverseMap(); 
    } 

    private static void MapProductPictureDTOToBDO() 
    { 
     Mapper.CreateMap<ProductPictureDTO, ProductPictureBDO>(); 
    } 

    private static void MapProductPictureBDOToDTO() 
    { 
     Mapper.CreateMap<ProductPictureDTO, ProductPictureBDO>().ReverseMap(); 
    } 

    private static void MapProductNoteDTOToBDO() 
    { 
     Mapper.CreateMap<ProductNoteDTO, ProductNoteBDO>(); 
    } 

    private static void MapProductNoteBDOToDTO() 
    { 
     Mapper.CreateMap<ProductNoteDTO, ProductNoteBDO>().ReverseMap(); 
    } 

    private static void MapStockProductDTOToBDO() 
    { 
     Mapper.CreateMap<StockProductDTO, StockProductBDO>(); 
    } 

    private static void MapStockProductBDOToDTO() 
    { 
     Mapper.CreateMap<StockProductDTO, StockProductBDO>().ReverseMap(); 
    } 

    private static void MapTagDTOToBDO() 
    { 
     Mapper.CreateMap<TagDTO, TagBDO>(); 
    } 

    private static void MapTagBDOToDTO() 
    { 
     Mapper.CreateMap<TagDTO, TagBDO>().ReverseMap(); 
    } 

आप उसे स्थिर निर्माता के साथ एक स्थिर वर्ग, जिसका अर्थ है कि निर्माता आवेदन जीवन काल के दौरान एक से अधिक बार बुलाया जाएगा है देख सकते हैं। पहली बार जब आप कनवर्ट विधि को कॉल करते हैं, तो कन्स्ट्रक्टर को कॉल किया जाता है और सभी मैपिंग बनाए जाते हैं। दूसरा, तीसरा, चौथा ... एन समय आप उसी सत्र के दौरान कनवर्ट विधि को कैल करेंगे, कन्स्ट्रक्टर को नहीं बुलाया जाएगा।

लाभ:

  • एक विशेष मानचित्रण से एक बार
  • मैपिंग केवल बनाई गई हैं जब आप (इस मामले में जब आप उत्पाद के साथ काम) उन्हें जरूरत अधिक नहीं बनाया जा सकता। आप आवेदन शुरू होने पर 1000 मैपिंग नहीं बनाते हैं, फिर उनमें से केवल 5 या 6 का उपयोग करते हैं।

नुकसान:

  • डेवलपर सभी प्रकार वह/वह चाहता है, प्रकार चेक न किया जाए साथ सामान्य Convert विधि कॉल कर सकते हैं। एक सामान्य विधि का उपयोग करने के तरीके से कम कोड की आवश्यकता होती है, और यदि मैपिंग्स नहीं बनाए गए हैं तो ऑटोमैपर द्वारा एक अपवाद फेंक दिया जाएगा।
संबंधित मुद्दे