डीएएल और बीएलएल लेयर्स के बीच डेटा और व्यावसायिक वस्तुओं को प्राप्त करने का पृथक्करण


9

मैंने इस प्रश्न को पोस्ट करने से पहले कुछ शोध किया। अन्य प्रश्नों या पोस्ट के बीच, उनमें से एक नीचे दिया गया है। मैं स्पष्ट मन नहीं पा सका कि कैसे निर्धारित किया जाए ..

डेटा एक्सेस लेयर के भीतर व्यावसायिक वस्तुएँ

मेरे पास एक रिपॉजिटरी है और बिजनेस लेयर्स डेटा को पुनः प्राप्त करने के लिए रिपॉजिटरी को कॉल करते हैं। उदाहरण के लिए, मान लें कि मेरे पास BLL और DAL के लिए निम्न वर्ग हैं:

class BllCustomer
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public BllAddress Address {get; set;}
}

class BllAddress
{
     public int AddressId {get; set;}
     public String Street {get; set;}
     public String City {get; set;}
     public String ZipCode {get; set; }
}

class DalCustomer 
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public int AddressID {get; set;}
}

class DalAddress
{
     public int AddressId {get; set;}
     public String Street {get; set;}
     public String City {get; set;}
     public String ZipCode {get; set; }
}

यदि BLL ग्राहक ऑब्जेक्ट को पुनः प्राप्त करना चाहता है, तो वह DAL में GetCustomerById (customerId) को कॉल करेगा।

निम्नलिखित मेरी चिंताएं हैं जिन्हें मैं स्पष्ट मन नहीं कर सका:

  1. मैं यह नहीं देख सकता कि DAL में GetCustomerById को किस वस्तु का निर्धारण करना चाहिए? क्या इसे BllCustomer या DalCustomer को वापस करना चाहिए?

  2. ग्राहक के साथ जुड़े पते का पुनर्प्रकाशन (और व्यावसायिक वस्तु में परिवर्तित) कहां होना चाहिए?

यदि DAL दाल वस्तुएं लौटाता है, तो पते को पुनः प्राप्त करने और भरने का तर्क केवल BLL में हो सकता है। यदि DAL BLL ऑब्जेक्ट लौटाता है, तो पता पुनः प्राप्त करने और भरने का तर्क या तो BLL या DAL में हो सकता है। वर्तमान में डीएएल व्यावसायिक वस्तुओं को लौटा रहा है और इसे भरने के लिए तर्क डीएएल में है।

मैं जो पढ़ता हूं, उससे मुझे लगता है कि कोई सही या गलत नहीं है। ऊपर दिए गए लिंक से, एक तरह से लोग कह रहे हैं और दूसरे लोग दूसरे तरीके से कह रहे हैं। लेकिन मैं कैसे निर्धारित करूं कि मेरे मामले में सबसे अच्छा काम करेगा?

किसी भी सहायता की सराहना की जाएगी।


2
मेरा पहला सवाल होगा: यह एक विरासत अनुप्रयोग है? वहाँ बहुत सारे ORM फ्रेमवर्क हैं जो इस तरह के कोड को अप्रचलित बनाते हैं और मैं आपसे इस तरह के ढांचे पर विचार करने का आग्रह करूंगा ...
JDT

@JDT मुझे यकीन नहीं है कि आपका क्या मतलब है, मैं एंटिटी फ्रेमवर्क का उपयोग कर रहा हूं और ठीक उसी समस्या का सामना कर रहा हूं। जैसा कि मैंने इसे समझा है, आप अपने ORM को डोमेन ऑब्जेक्ट के रूप में उपयोग करने वाले नहीं हैं, तो अनुवाद कहाँ किया जाता है?
स्यूडोकोडर

आपका ORM ढांचा उन वस्तुओं को क्यों नहीं लौटाएगा जो डोमेन ऑब्जेक्ट्स हैं?
JDT

3
@JDT ORM (इस मामले में EF) प्रति इकाई वर्ग का प्रतिनिधित्व करता है, जो आम तौर पर प्रति वर्ग एक डेटाबेस तालिका का प्रतिनिधित्व करता है। यह आमतौर पर समान है, लेकिन जरूरी नहीं कि डोमेन कक्षाओं के समान ही हो। हो सकता है कि आप केवल यह कह रहे हों कि ORM कक्षाओं को डोमेन कक्षाओं के रूप में उपयोग करना ठीक है? मैंने कई स्थानों पर पढ़ा है कि यह एक नहीं है।
स्यूडोकोडर

जवाबों:


5

मैं यह नहीं देख सकता कि DAL में GetCustomerById को किस वस्तु का निर्धारण करना चाहिए? क्या इसे BllCustomer या DalCustomer को वापस करना चाहिए?

यह एक लौटना चाहिए DalCustomer वस्तु, एक लौटने BllCustomer वस्तु टूट जाएगा एकल जिम्मेदारी सिद्धांत। आप DalCustomer ऑब्जेक्ट को व्यवसाय परत (या उपभोक्ता) द्वारा खपत इंटरफ़ेस या अनुबंध के रूप में देख सकते हैं । यदि यह एक BllCustomer लौटा तो वास्तव में DAL को हर व्यावसायिक परत ऑब्जेक्ट के लिए पूरा करना होगा जो इसे कॉल करता है या संभवतः इसे कॉल कर सकता है।

ग्राहक के साथ जुड़े पते का पुनर्प्रकाशन (और व्यावसायिक वस्तु में परिवर्तित) कहां होना चाहिए?

रूपांतरण एक दृश्य मॉडल या प्रबंधक में किया जाना चाहिए । आपको अपनी सेवा या डेटा एक्सेस घटक को कॉल करने के लिए एक मध्यस्थ की आवश्यकता है। यदि आपको आवश्यकता महसूस होती है तो आप अपने BllCustomer ऑब्जेक्ट में रूपांतरण कर सकते हैं । लेकिन तब जब आप अपने DAL को MSSQL से ओरेकल तक स्वैप करते हैं उदाहरण के लिए आपकी लौटी हुई वस्तु (या इंटरफ़ेस) वही रहना चाहिए।

अधिमानतः आपकी व्यावसायिक परत आपके डेटा लेयर से भी स्वतंत्र होनी चाहिए। बिजनेस लेयर आपके व्यावसायिक नियमों के लिए जिम्मेदार है। यह आपके व्यवसाय नियमों को लागू करने के लिए एक सत्यापन ढांचे का उपयोग करके आपके सत्यापन को जोड़ देगा।


4

आपकी रिपॉजिटरी को BLL या डोमेन ऑब्जेक्ट वापस करना चाहिए। संभावना है कि आपको DAL ऑब्जेक्ट की बिल्कुल भी आवश्यकता नहीं है।

public class Customer
{
    public string Name {get; private set;}
    public Customer(string name)
    {
        this.Name = name;
    }
}

public class Repository
{
    public Customer GetCustomer(string id)
    {
        //get data from db
        return new Customer(datarow["name"]);
    }
}

क्या बीएलएल या अलग वर्ग के पुस्तकालय को कंक्रीट कक्षाओं की बजाय इंटरफेस को उजागर करना चाहिए Customer?
योला

1
ठोस वर्गों को उजागर करने के लिए इसका जुर्माना। रिपॉजिटरी के लिए एक इंटरफ़ेस उपयोगी होगा
इवान

3

आमतौर पर, DAL को BLL का कोई ज्ञान नहीं होता है। इस तरह से सोचें, एक अलग बीएलएल के साथ एक अलग एप्लिकेशन एक ही डीएएल का उपयोग कर सकता है। एक पेबल्स एप्लिकेशन / मॉड्यूल और एक ही कंपनी के लिए एक प्राप्य एप्लिकेशन डेटा (क्लाइंट, शुल्क, भुगतान आदि) साझा करेगा। एक DLL की कोशिश करने से एक से अधिक BLL का ज्ञान होता है जो बहुत कठिन और अनावश्यक होगा। यह आपको BLL पर कोई प्रभाव नहीं (जब तक आप इंटरफेस नहीं तोड़ते) के साथ अपने डेटा स्टोरेज को बदलने की अनुमति देगा।

अब आप बीएलएल को एक डीएएल ऑब्जेक्ट पास कर सकते हैं या आप ऑब्जेक्ट का तीसरा सेट बना सकते हैं: एंटिटी। इनमें केवल एक साथ पारित होने वाले मान शामिल होंगे। DAL इकाई को संदर्भित करेगा और आपके स्टोरेज / डेटाबेस के साथ बातचीत करेगा और BLL सभी लॉजिक को हैंडल करेगा और DAL को संदर्भित करेगा।

class EntCustomer
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public BllAddress Address {get; set;}
}
class BllCustomer
{
   //reference EntCustomer, DalCustomer and handle business rules/logic
}

class DalCustomer 
{
   //reference EntCustomer and interact with data storage
}

आपकी टिप्पणी के लिये धन्यवाद। मैं आपसे सहमत हूं .. मैं पहले से ही देख सकता हूं कि हमारा DAL / (रिपॉजिटरी) पहले से ही लॉजिक्स से भरा हुआ है जैसे कि यदि प्रकार A है, तो तालिका B से डेटा पुनर्प्राप्त करें, लेकिन यदि प्रकार C है, तो तालिका से डेटा पुनर्प्राप्त करें। सी। लेकिन मैं EntCustomer का उपयोग करके आपके उदाहरण से भ्रमित हूं। मेरे मामले में, DalCustomer DB में तालिकाओं का दर्पण है। क्या आप अधिक उदाहरण प्रदान कर सकते हैं, कि EntCustomer का उपयोग कैसे किया जाता है या मुझे इसका उपयोग क्यों करना चाहिए और इसके लाभ हैं। मैं DalObjects को BLL में वापस करने के लिए DAL को बदलने की सोच रहा हूं। Bll व्यावसायिक Objs में रूपांतरण को लटका देगा, नेस्टेड obj में पुनः प्राप्त और भरेगा।
शामिरजज

क्या आप अधिक प्रतिक्रिया प्रदान कर सकते हैं?
शमीरदाज

मुझे लगता है कि एंट-ऑब्जेक्ट्स का उद्देश्य सिर्फ DAL और BLL के बीच डेटा ट्रांसफर करना है। आपकी DAL कक्षाएं db संरचना को प्रतिबिंबित करना जारी रख सकती हैं, लेकिन वे कक्षाएं DAL के लिए आंतरिक होंगी। जब BLL DAL से डेटा मांगता है, तो DAL डेटाबेस (dalcustomer + daladdress) से आवश्यक DAL-ऑब्जेक्ट लाएगा और उनमें से EntCustomer का एक उदाहरण बनाएगा और उसे BLL में लौटा देगा।
आर्टोकाइ

-1

डीएएल बीएल से स्वतंत्र होना चाहिए और बीएल डीएएल पर निर्भर होना चाहिए। आपका UI केवल BL के माध्यम से डेटा एक्सेस करना चाहिए। इसका अच्छा अभ्यास यदि आप DAL से DataTable या DataRow लौटाते हैं और फिर DataTable / DataRow को BL ऑब्जेक्ट (एस) में परिवर्तित करते हैं। जब आपके UI को डेटा तक पहुंचने की आवश्यकता होती है, तो वह BL से एक्सेस कर सकता है। तो UI स्तंभ नाम और डेटाबेस प्रकार (SQL सर्वर, Oracle ..) से स्वतंत्र होगा। इस तरह से आपका UI DAL से पूरी तरह से स्वतंत्र होगा। व्यक्तिगत रूप से मैं "कस्टमर बीएल" जैसे वर्ग का नाम पसंद करता हूं, वर्ग नाम के भीख में बीएल शब्द का उपयोग न करें।

नीचे नमूना कोड देखें।

//Customer Class
class BllCustomer
{
    public int CustomerId { get; set; }
    public String Name { get; set; }
    public BllAddress Address { get; set; }

    public static BllCustomer GetByCustomerId(int id)
    {
        DataRow dr = DalCustomer.GetByCustomerId(id);
        if (dr == null)
            return null;
        BllCustomer oCust = new BllCustomer();
        oCust.CustomerId = int.Parse(dr["CustomerId"].ToString());
        //Do for other class members and load values

        return oCust;
    }
}


class DalCustomer
{

    public static DataRow GetByCustomerId(int id)
    {
        //Get Data row from Database and return Datarow
        DataRow CustomerRow = GETFROMDATABASE("SELECT * from CUSTOMER");
        return CustomerRow;
    }
}

Err ... तो इसका मतलब यह नहीं है कि आपके BLL को आपके डेटा टेबलों के प्रारूप / संरचना का ज्ञान होना चाहिए? ...
पॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.