2009-02-05 12 views
11

पर डेटा एक्सेस लेयर से कौन सी ऑब्जेक्ट्स लौटनी चाहिए यदि आपके पास उदाहरण के लिए, व्यक्ति (आईडी, नाम इत्यादि) नामक डेटाबेस तालिका है, तो डेटा किस प्रकार की ऑब्जेक्ट को टियर रिटर्न एक्सेस करना चाहिए व्यापार स्तर के लिए? मैं कुछ इस तरह सोच रहा हूँ:डेटा एक्सेस लेयर से आपको एन-स्तरीय सिस्टम

//data access tier 
public class DataAccess{ 

    public interface IPerson{ 
     int ID{ get; set; } 
     string Name{ get; set; } 
    } 

    internal class Person : IPerson{ 
     private int id; 
     private string name; 

     public int ID{ get{return id; } set{ id=value; } } 
     public int Name{ get{retutn name; } set{ name=value; } 
    } 

    public static IPerson GetPerson(int personId) 
    { 
     //get person record from db, populate Person object 
     return person; 
    } 
} 

//business tier 
public class Person : IPerson{ 
    private int id; 
    private string name; 

    public int ID{ get{return id;} set{id=value;} } 
    public string Name{ get{return name;} set{name=value;} } 

    public void Populate(int personId){ 
     IPerson temp = DataAccess.GetPerson(personId); 
     this.ID = temp.ID; 
     this.Name = temp.Name; 
    } 
} 

लेकिन यह सब एक छोटे से बोझिल लगता है? क्या इस समस्या का एक और अधिक सुरुचिपूर्ण समाधान है? क्या मुझे डेटा एक्सेस लेयर से डेटा लेयर को व्यावसायिक परत पर वापस करना चाहिए?

उत्तर

21

आपको अपनी डेटा एक्सेस लेयर (डीएएल) में कक्षा परिभाषा को दोहराने की आवश्यकता नहीं है।

आप अपनी व्यावसायिक संस्थाओं को एक अलग असेंबली में 'गूंगा' कंटेनर के रूप में बना सकते हैं, उदा। आपकी व्यक्तिगत श्रेणी बस हो सकती है: -

public class Person 
{ 
    int ID { get; set: } 
    string Name { get; set: } 
} 

फिर, आप अपने डीएएल को व्यावसायिक संस्थाओं परत का संदर्भ दे सकते हैं। आपके नियंत्रक ऑब्जेक्ट्स, चाहे वे एक अलग व्यापार तर्क परत में हों, या आपके यूआई परत में हों, फिर केवल डीएएल को कॉल कर सकते हैं, जो एक व्यावसायिक इकाई बना सकता है, इसे डेटाबेस से पॉप्युलेट कर सकता है और इसे अपने कंट्रोलर पर वापस कर सकता है।

This article इमर स्पापानजार्स द्वारा इस पैटर्न का एक अच्छा स्पष्टीकरण है।

+0

डीएएल को व्यावसायिक संस्थाओं परत के संदर्भ में एक [अवांछित] दो-तरफा निर्भरता बनाने का संदर्भ नहीं दे रहा है? –

+0

नहीं, व्यापार संस्थाओं परत को डीएएल को कोई भरोसा नहीं होगा। यह सिर्फ 'गूंगा' कंटेनर वस्तुओं का एक assembly है। आपके ऐप (यूआई या अलग व्यापार तर्क परत) का हिस्सा जो उन्हें डीएएल से अनुरोध कर रहा है, असेंबली के दूसरे हिस्से में होना चाहिए और डीएएल और संस्थाओं दोनों को संदर्भित करना चाहिए। –

+0

असेंबली ए: कक्षा परिभाषा, फ़ील्ड और गुणों के अलावा कुछ भी नहीं। डोमेन असेंबली असेंबली बी: ​​डीएएल। संदर्भ असेंबली ए असेंबली सी: यूआई। संदर्भ असेंबली ए और बी – Amy

5

आपकी व्यावसायिक परत निश्चित रूप से डेटा पंक्तियों के बारे में जानना नहीं चाहती - डेटा परत में डेटा विशिष्ट कक्षाओं को छोड़ने का प्रयास करें। यह युग्मन को कम करता है और थोक पुनर्विक्रय के बिना बाद की तारीख में अपनी दृढ़ता परत को बदलने के लिए आपको मुक्त करता है।

अपने विशिष्ट समस्या का समाधान करने के लिए, आप या तो:

  • आपका डेटा स्तर में मूलभूत डाटा वस्तुओं/संस्थाओं बनाएँ और उन्हें उपभोग के लिए अपने व्यापार परत को बंद हाथ।
  • या, जैसा कि ऐसा लगता है कि आप कर रहे हैं, डीटीओ (डेटा ट्रांसफर ऑब्जेक्ट्स) बनाएं जो डेटा परत से डेटा को उच्च स्तर पर आपके व्यापार ऑब्जेक्ट के एक अमीर कार्यान्वयन के रूप में स्थानांतरित करने के साधन के रूप में पूरी तरह मौजूद हैं। आप इसे एक समृद्ध डोमेन मॉडल में एक भंडार पैटर्न के हिस्से के रूप में कर सकते हैं।

दूसरी चीज जो आप सोचना चाहें वह टायर वी परतें है - इससे आप इन चीजों के बारे में सोचते हैं। टायर आमतौर पर शारीरिक होते हैं, दूसरे शब्दों में वे प्रक्रियाओं के बीच की सीमाओं को परिभाषित करते हैं। परतें आम तौर पर तार्किक होती हैं, वे एक प्रोग्राम की कार्यक्षमता को कमजोर युग्मित इकाइयों में अलग करते हैं। आप इस मामले में परतों का लक्ष्य रख रहे हैं।

1

यदि आप अपने डीएओ कक्षाओं में इंटरफेस बनाते हैं और उन्हें अपने व्यापार स्तर के भीतर रखते हैं, तो आप डेटा एक्सेस टियर से अपने व्यापार स्तर को संदर्भित कर सकते हैं। डेटा स्तर में डीएओ कक्षाएं व्यापार स्तर से वस्तुओं की वापसी करती हैं।

आपका व्यवसाय स्तर सीधे डेटा एक्सेस ऑब्जेक्ट्स को संदर्भित करने के बजाय इंटरफेस का संदर्भ देता है। एक आईओसी कंटेनर के माध्यम से निर्भरता इंजेक्शन (उदाहरण के लिए कैसल विंडसर) आपको इसे पूरा करने की अनुमति देगा।

इस तकनीक कहा जाता है अलग interfaced और यहाँ वर्णित है:

http://www.martinfowler.com/eaaCatalog/separatedInterface.html

इस तकनीक मैंने देखा है की सबसे अच्छा विवरण NHibernate पर इस लेख में पाया जा सकता है सर्वोत्तम प्रथाओं, बिली McCafferty ने लिखा है।

http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

लेख जानकारी है कि NHiberbate के लिए विशिष्ट है की बहुत कुछ है, लेकिन यह एक अच्छा आधा अनुप्रयोगों को डिजाइन करने पर सिर्फ ठोस जानकारी शिथिल युग्मित किया जाना है और आसानी से इकाई का परीक्षण किया है।

0

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

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