ডাল এবং বিএলএল স্তরগুলির মধ্যে ডেটা এবং ব্যবসায়ের সামগ্রী পুনরুদ্ধার পৃথকীকরণ


9

এই প্রশ্নটি পোস্ট করার আগে আমি কিছু গবেষণা করেছি। অন্যান্য প্রশ্ন বা পোস্টের মধ্যে এর মধ্যে একটি নীচে সরবরাহ করা হয়েছে। আমি কীভাবে নির্ধারণ করব তা পরিষ্কার মন পেতে পারি নি ..

একটি ডেটা অ্যাক্সেস লেয়ারের মধ্যে ব্যবসায়িক বিষয়গুলি

আমার কাছে একটি সংগ্রহস্থল রয়েছে এবং ব্যবসায়িক স্তরগুলি ডেটা পুনরুদ্ধারের জন্য ভান্ডারটিকে কল করে। উদাহরণস্বরূপ, বলুন আমার কাছে বিএলএল এবং ডালের জন্য নিম্নলিখিত ক্লাস রয়েছে:

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; }
}

বিএলএল যদি কোনও গ্রাহক অবজেক্টটি পুনরুদ্ধার করতে চায় তবে এটি ডএল-এ গেটকাস্টমারবিআইআইডি (গ্রাহকআইডি) কল করবে।

নীচে আমার উদ্বেগগুলি আমি পরিষ্কার মন পেতে পারি না:

  1. আমি দেখতে পাচ্ছি না যে ডালের গেটকাস্টমারবিআইআইডি কী জিনিসটি ফিরে আসবে তা নির্ধারণ করব? এটি কি বেলকাস্টমার বা ডাল কাস্টমার ফিরতে হবে?

  2. গ্রাহকের সাথে সম্পর্কিত ঠিকানাটি পুনরুদ্ধার (এবং / অথবা ব্যবসায়িক সামগ্রীতে রূপান্তর) কোথায় হওয়া উচিত?

ডাল যদি ডাল বস্তুগুলি ফেরত দেয় তবে ঠিকানাটি পুনরুদ্ধার করতে এবং পূরণ করার যুক্তি কেবল বিএলএলে থাকতে পারে। যদি ডএল বিএলএল অবজেক্টগুলি ফেরত দেয়, তবে ঠিকানাটি পুনরুদ্ধার করতে এবং পূরণ করার যুক্তিটি বিএলএল বা ডএল হতে পারে। বর্তমানে ডাল ব্যবসায়িক অবজেক্টগুলি ফিরিয়ে দিচ্ছে এবং এটি পূরণ করার যুক্তিটি ডালের মধ্যে রয়েছে।

আমি যা পড়েছি তা থেকে অনুমান করি কোনও সঠিক বা ভুল নেই। উপরের লিঙ্কটি থেকে, সেখানে লোকেরা এক উপায়ে বলছে এবং অন্যরা অন্যভাবে বলছে। তবে আমি কীভাবে নির্ধারণ করব যে আমার ক্ষেত্রে সবচেয়ে ভাল কাজ করবে?

কোন সাহায্য প্রশংসা করা হবে।


2
আমার প্রথম প্রশ্নটি হবে: এটি কি কোনও উত্তরাধিকারের আবেদন? সেখানে প্রচুর পরিমাণে ওআরএম ফ্রেমওয়ার্ক রয়েছে যা এই ধরণের কোডকে অচল করে দেয় এবং আমি আপনাকে এই ধরনের কাঠামোটি বিবেচনা করার জন্য অনুরোধ করব ...
জেডিটি

@ জেডিডি আমি নিশ্চিত না যে আপনি কী বোঝাতে চেয়েছেন, আমি সত্তা ফ্রেমওয়ার্ক ব্যবহার করছি এবং ঠিক একই সমস্যা আছে। যেহেতু আমি এটি বুঝতে পারি, আপনি নিজের ওআরএম ডোমেন অবজেক্ট হিসাবে ব্যবহার করবেন না, তাই অনুবাদটি কোথায় করা হয়েছে?
সিউডোকোডার

আপনার ওআরএম কাঠামো কেন ডোমেন অবজেক্টগুলি এমন বস্তুগুলিকে ফেরত দেবে না?
জেডিটি

3
@ জেডিটি ওআরএম (এই ক্ষেত্রে ইএফ) সত্তা শ্রেণিগুলি প্রদান করে যা সাধারণত প্রতি ক্লাসে একটি করে ডাটাবেস সারণি উপস্থাপন করে। এটি সাধারণত ডোমেন ক্লাসগুলির মতো, তবে একইভাবে হয় না। হয়তো আপনি কেবল বলছেন যে ওআরএম ক্লাসগুলি ডোমেন ক্লাস হিসাবে ব্যবহার করা ঠিক আছে? আমি বেশ কয়েকটি জায়গায় পড়েছি যে এটি কোনও নম্বর নয়।
সিউডোকোডার

উত্তর:


5

আমি দেখতে পাচ্ছি না যে ডালের গেটকাস্টমারবিআইআইডি কী জিনিসটি ফিরে আসবে তা নির্ধারণ করব? এটি কি বেলকাস্টমার বা ডাল কাস্টমার ফিরতে হবে?

এটি ডাল কাস্টমারের অবজেক্টটি ফিরিয়ে আনতে হবে , একটি বেলকাস্টমার অবজেক্ট ফেরত দেওয়া একক-দায়িত্বের নীতিটি ভঙ্গ করবে । আপনি ডালকাস্টমার অবজেক্টটিকে ব্যবসায়ের স্তর (বা গ্রাহক) দ্বারা গ্রাহিত ইন্টারফেস বা চুক্তি হিসাবে দেখতে পারেন । কার্যত যদি এটি একটি বেলকাস্টারকে ফিরিয়ে দেয় তবে ডালকে প্রতিটি ব্যবসায়ের স্তর অবজেক্টের জন্য প্রয়োজনীয় যা এটি কল করে বা এটি কল করতে পারে।

গ্রাহকের সাথে সম্পর্কিত ঠিকানাটি পুনরুদ্ধার (এবং / অথবা ব্যবসায়িক সামগ্রীতে রূপান্তর) কোথায় হওয়া উচিত?

রূপান্তরটি কোনও ভিউ মডেল বা ম্যানেজারের মাধ্যমে করা উচিত। আপনার পরিষেবা বা ডেটা অ্যাক্সেস উপাদানকে কল করতে আপনার কাছে কোনও মধ্যস্থতাকারী থাকা দরকার। আপনি যদি প্রয়োজন বোধ করেন তবে আপনার বেলকাস্টমার অবজেক্টে কোনও রূপান্তর থাকতে পারে । তবে তারপরে আপনি যখন এমএসএসকিউএল থেকে ওরাকলের উদাহরণস্বরূপ আপনার ডাল অদলবদল করতে পারেন তখন আপনার ফিরে আসা অবজেক্ট (বা ইন্টারফেস) অবশ্যই একই থাকবে।

আপনার ব্যবসায়ের স্তরটি আপনার ডেটা স্তর থেকে পৃথক হওয়া উচিত। ব্যবসায় স্তর আপনার ব্যবসায়ের নিয়মের জন্য দায়ী responsible এটি এখানে আপনার ব্যবসায়ের বিধি প্রয়োগ করার জন্য একটি বৈধতা ফ্রেমওয়ার্ক ব্যবহার করে আপনার বৈধতা যুক্ত করবে।


4

আপনার সংগ্রহস্থলের বিএলএল বা ডোমেন অবজেক্টটি ফেরত দেওয়া উচিত। সম্ভাবনা হ'ল আপনার কোনও ডাল অবজেক্টের দরকার নেই।

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

সাধারণত, ডালের বিএলএল সম্পর্কে কোনও জ্ঞান নেই। এটি এইভাবে ভাবুন, ভিন্ন বিএলএল সহ একটি আলাদা অ্যাপ্লিকেশন একই ডাল ব্যবহার করতে পারে। একই কোম্পানির জন্য একটি পেয়েবল অ্যাপ্লিকেশন / মডিউল এবং একটি রিসিভেবল অ্যাপ্লিকেশন ডেটা (ক্লায়েন্ট, চার্জ, পেমেন্ট ইত্যাদি) শেয়ার করবে। একটি ডিএলএল একাধিক বিএলএল জ্ঞান রাখার চেষ্টা করা খুব কঠিন এবং অপ্রয়োজনীয় হবে। এটি আপনাকে বিএলএলে কোনও প্রভাব ছাড়াই আপনার ডেটা স্টোরেজ পরিবর্তন করার অনুমতি দেয় (যতক্ষণ না আপনি ইন্টারফেসগুলি ভঙ্গ করবেন না)।

আপনি এখন বিএলএলে একটি ডাল অবজেক্টটি পাস করতে পারেন বা আপনি কোনও তৃতীয় সেট অবজেক্ট তৈরি করতে পারেন: সত্তা। এগুলিতে একসাথে পাস করার জন্য কেবল মানগুলি থাকবে। ডাল সত্তাটি উল্লেখ করে এবং আপনার স্টোরেজ / ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করবে এবং বিএলএল সমস্ত যুক্তি পরিচালনা করবে এবং ডালের রেফারেন্স করবে।

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 বিএল বিজনেস ওবজে রূপান্তরিত হবে, পুনরুদ্ধার করবে এবং নেস্টেড আপত্তি পূরণ করবে।
শমিরডাজ

আপনি আরও প্রতিক্রিয়া প্রদান করতে পারেন?
শামিরডাজ

আমি মনে করি যে এনট-অবজেক্টগুলির উদ্দেশ্য কেবলমাত্র ডাল এবং বিএলএল এর মধ্যে ডেটা স্থানান্তর করা। আপনার ডএল ক্লাসগুলি ডিবি কাঠামোটি মিরর করা চালিয়ে যেতে পারে, তবে এই শ্রেণিগুলি ডালের অভ্যন্তরীণ হবে। বিএলএল যখন ডএল থেকে ডেটা চাইবে, ডাল ডাটাবেস (ডালকাস্টোমার + ডালড্রেসেস) থেকে প্রয়োজনীয় ডাল-বস্তুগুলি আনবে এবং এগুলি থেকে এন্টকাস্টমারের একটি উদাহরণ তৈরি করবে এবং এটি বিএলএলে ফিরিয়ে দেবে।
আরতোকাই

-1

ডালের বিএল এবং বিএল থেকে ডিএল নির্ভর হতে হবে। আপনার ইউআই এর কেবল বিএল এর মাধ্যমে ডেটা অ্যাক্সেস করা উচিত। এটি ডাল থেকে ডেটা টেবিল বা ডেটারো ফেরত দেয় এবং তারপরে ডেটা টেবিল / ডেটারোকে বিএল অবজেক্টে রূপান্তর করে যদি এর ভাল অনুশীলন। যখন আপনার ইউআই-তে ডেটা অ্যাক্সেস করার দরকার পড়ে তখন তা বিএল থেকে অ্যাক্সেস করতে পারে। সুতরাং ইউআই কলামের নাম এবং ডাটাবেস টাইপ (এসকিউএল সার্ভার, ওরাকল ..) থেকে স্বতন্ত্র হবে। এইভাবে আপনার ইউআই ডাল থেকে সম্পূর্ণ স্বাধীন হবে। ব্যক্তিগতভাবে আমি "গ্রাহকবিএল" এর মতো শ্রেণীর নাম পছন্দ করি, শ্রেণীর নাম ভিক্ষায় বিএল শব্দটি ব্যবহার করি না।

নীচে নমুনা কোড দেখুন।

//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;
    }
}

এর ... তার মানে কি এই নয় যে আপনার বিএলএলকে আপনার ডেটা টেবিলগুলির বিন্যাস / গঠন সম্পর্কে জ্ঞান থাকা দরকার? ...
পল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.