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


12

তাই আমি টিডিডি এর মাধ্যমে ডেটা অ্যাক্সেস স্তর তৈরি করেছি এবং কিছুটা উদ্বেগের কাছে পৌঁছেছি। আমি বরং ভুল পথটি শুরু করব না, তাই আমি অনুভব করেছি যে আমি আপনাকে বলছি যে আমার চিন্তাভাবনা একটি পরিষ্কার স্থাপত্যের সাথে সামঞ্জস্যপূর্ণ কিনা।

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

public int DeleteRecord(int recordId)
{
    recordId.RequireThat("recordId").NotZeroOrLess();

    List<SqlParameter> parameters = new List<SqlParameter>();
    parameters.Add(new SqlParameter { ParameterName = "@RecordId", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = recordId});

    return this.ExecuteNonQuery("DeleteRecord", parameters.ToArray());
}

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

তবে, অন্য ডাল পদ্ধতিতে বলুন, আমি একটি রেকর্ড লোড করতে চাই। আমার লোড পদ্ধতিটি selectsএকগুচ্ছ টেবিলগুলির বিরুদ্ধে কার্যকর হবে এবং একটি ফিরিয়ে দেবে DataSet, তবে আমি লড়াই করে যাচ্ছি যে আমার ডালটি ব্যবহার করে পদ্ধতিটির মধ্যে বিজনেস অবজেক্ট তৈরি করা উচিত DataSet, বা আমার ব্যবসায়িক বিষয়গুলিতে নিজেরাই যদি কেবল একটি Load()পদ্ধতি পায় যা পায় DataSetডাল থেকে এবং তারপরে মূলত নিজেকে পূরণ করে।

ডএল দিয়ে এটি করার ফলে ব্যবসায়িক অবজেক্টগুলিতে কম যুক্তি দেখা দেবে (যদিও এটি কেবলমাত্র যুক্তিযুক্ত নির্বাচন করা হয়, এটি এখনও যুক্তিযুক্ত) তবে ড্যালকে কিছুটা ভিড় করে এমন মনে হবে যে এটি সত্যিই এমন কিছু করছে যা এটি করা উচিত নয় ' করছ না

তোমরা কি ভাবো?


আপনি সত্তা ফ্রেমওয়ার্ক কেন ব্যবহার করেননি?
jfrankcarr

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

আমি EF শিখতে সময় দেওয়ার পরামর্শ দিই। এটি প্রথমে কিছুটা উদ্বেগজনক বলে মনে হতে পারে, বিশেষত যখন এটি একটি বিদ্যমান ডাটাবেসের সাথে কিছুটা বিদ্যমান-বিদ্যমান ডিজাইনের সমস্যাগুলির সাথে ফিট করার চেষ্টা করছে তবে এটি মূল্যবান।
jfrankcarr

আপনি যদি অন্য কোনও বিকল্পটি সন্ধান করতে চান তবে আপনি এনএইচবারনেটটিও দেখতে পারেন।
ডোন 01001100

@ জেফরঙ্ককারার - আমি অবশ্যই এটিকে দেখব, তবে এটি কীভাবে একটি বহু-স্তরযুক্ত ডেটা অ্যাক্সেস অ্যাপ্লিকেশনটির সাথে খাপ খায়? সত্তা কাঠামো নিজেই ডএল, বা অন্য স্তর বা এমনকি ব্যবসায়িক অবজেক্টের মধ্যে প্রয়োগ করা হবে?

উত্তর:


4

আপনার ডালের আপনার ডেটা অবজেক্টগুলি ফিরিয়ে দেওয়া উচিত

আদর্শভাবে আপনার ডালটি একটি "ব্ল্যাক বক্স" অবজেক্ট হওয়া উচিত, যা আপনার অ্যাপ্লিকেশন কোডটি কোনও ডেটা অবজেক্টের জন্য জিজ্ঞাসা করতে বা বিদ্যমান ডেটা অবজেক্টগুলিকে ম্যানিপুলেট করতে পারে। কখনও কখনও ডাল এবং অ্যাপ্লিকেশন কোডের মধ্যে আরেকটি স্তর স্থাপন করা হয় Repositoryযা দুটি স্তরকে আরও পৃথক করে, যদিও এটি সর্বদা প্রয়োজন হয় না।

এছাড়াও, আপনি সাধারণত আপনার ব্যবসায়িক বিষয়গুলি নিজেরাই তৈরি করতে সক্ষম হবেন না। এটি সুরক্ষা গর্তের কারণ হতে পারে যেখানে কেউ আপনার গ্রন্থাগারটি ব্যবহার করতে পারে .Load(someId)এবং এটিতে কল করে আপনার অবজেক্টের একটি নতুন উদাহরণ তৈরি করতে পারে এবং এটি দুটি স্তরের সাথে একত্রী হয় যা সম্পূর্ণ পৃথক হওয়া উচিত।

আমি কোনও .Load(DataSet ds)পদ্ধতি সরবরাহ করার পরামর্শও দিচ্ছি না কারণ যদি ডেটা সেট সংজ্ঞা পরিবর্তন হয় তবে আপনাকে সেই ডেটা সেট ব্যবহার করে এমন ডেটা অবজেক্টগুলি সন্ধান করতে হবে এবং সেগুলি পরিবর্তন করতে হবে। আপনার সমস্ত ডেটা অ্যাক্সেস কোডকে এক জায়গায় রাখা আরও সহজ, সুতরাং আপনি যদি ডেটা অ্যাক্সেস কোয়েরি পরিবর্তন করেন তবে আপনাকে কেবল আপনার ডাল স্তরটি পরিবর্তন করতে হবে।


"সঠিক অবজেক্ট" সংজ্ঞাটি যদি অন্য স্তরে ধরে রাখা হয় তবে কীভাবে একটি স্তর "সঠিক বস্তুটি ফেরত" উপর নির্ভর করতে পারে তা নিশ্চিত নয়।
TMN

@ টিএমএন এটি খারাপভাবে বলা হয়েছিল। আমি শব্দটি কিছুটা পরিবর্তন করেছি কারণ আপনি ঠিক বলেছেন, অ্যাপ কোডটি এটি জানতে পারে যে এটি কী ধরণের বস্তুর জন্য জিজ্ঞাসা করছে।
রাহেল

@ রাচেল - গোটচা সুতরাং আপনি ডালকে আমার ব্যবসায়িক অবজেক্টটি যা যা হ'ল, তার একটি উদাহরণ ফেরত দেওয়ার পরামর্শ দিচ্ছেন? আপনার "ডেটা অবজেক্টস" শব্দটি শুনে আমি এক ধরণের বিভ্রান্ত হয়ে পড়েছিলাম তবে আমি মনে করি এটি আমি বুঝতে পেরেছি। এইভাবে, আমার কোডটি যেখানে প্রয়োজন কেবল (কেবল তাদের মাধ্যমে নয়) সেখান থেকে কোনও ব্যবসায়িক অবজেক্টের জন্য অনুরোধ করতে পারে, কেবল কল করে BusinessObject bo = DAL.LoadRecord(id);- ঠিক আছে? বিওতে নিজেই ক্যোয়ারী মানচিত্র করার যুক্তিটি ডালের মধ্যে থাকবে এবং কেবল সেখানে।

1
যে @Scott, সঠিক যদিও আমি ডাল পদ্ধতি কিছু নাম হবে Getপরিবর্তে Load, মতCustomer c = DAL.GetCustomer(id);
রেচেল

2

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

ডেটা স্তর থেকে ব্যবসায়ের স্তরে কাঁচা ডেটাসেট অবজেক্টগুলি পাস করার ধারণাটি আমি পছন্দ করি না। আমি এই ফলাফলটি বেশ কয়েকটি সমস্যার মধ্যে দেখেছি, বিশেষত যখন উত্তরাধিকারের ডেটা উত্সগুলি সংহত করে when কোনও প্রকল্পে আসা নতুন লোকেরা কোথা থেকে ডেটা আসছে তা বোঝা খুব জটিল করে তুলতে পারে। শেষ অবধি, এটির জন্য আপনার ব্যবসায়িক স্তরটি সরাসরি ডিবি থেকে ডেটা পরিচালনা করার ব্যবসায়ের সাথে থাকা দরকার যা রাস্তায় জটিলতা সৃষ্টি করতে পারে।

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


1
"কাঁচা ডেটাসেট অবজেক্টগুলি ডেটা স্তর থেকে ব্যবসায়ের স্তরে পাস করার ধারণাটি আমি পছন্দ করি না।" এই. হাজার বার, এই।
জোশুয়া স্মিথ

@ জেফরঙ্ককারার - আমার ডাল আসলে একটি ইন্টারফেস বাস্তবায়ন করে এবং স্তর থেকে স্তরকে ডেটা স্থানান্তর করে এমন সমস্ত কিছুর জন্য ইন্টারফেস রাখার পরিকল্পনা করি, তাই আমার ধারণা আমার প্যাটার্নের ধারণাগুলি সেখানে মেলে। সুতরাং আপনি কি আমাকে এমন পদ্ধতিগুলি পরিবর্তন করার পরামর্শ দিচ্ছেন ExecuteScalarযা ব্যবসায়ের স্তরে আরও বেশি অর্থবোধ তৈরি করে এমন মানগুলি ফেরত দেওয়ার জন্য প্রশ্নের সরাসরি ফলাফলকে ফিরিয়ে দিচ্ছে bool? আমি অন্যথায় মনে করি, এটি রাহেলার একটি খুব অনুরূপ উত্তর।

আমি কল তৈরি / আপডেট / মুছে ফেলার জন্য সাধারণত একটি বুলিয়ান ফিরিয়ে আনি যদি না আমার প্রভাবিত রেকর্ডের সংখ্যার প্রয়োজন হয়। উদাহরণস্বরূপ, যদি কোনও সঞ্চয়কৃত একাধিক অর্ডার লাইন বা এর মতো কিছু প্রক্রিয়াজাত করা হয় তবে আমি কোনও int ফিরিয়ে দিতে পারি।
jfrankcarr

0

আপনার ডালের একটি ডেটাসেট ফেরত দেওয়া উচিত। যে ডেটাসেটটি ফেরত আসল তা হ'ল বিজনেস অবজেক্ট, এটির প্রত্যাশিত ডেটা আছে কিনা তা যাচাই করা ছাড়া এটি করার জন্য আপনার আর কিছু করার দরকার নেই। আপনার যদি এটির সাথে আরও বেশি কিছু করার প্রয়োজন হয় তবে আপনি হয় কোনও একক সঞ্চিত পদ্ধতিতে খুব বেশি কিছু করার চেষ্টা করছেন বা সঞ্চিত পদ্ধতিতে ডেটাটি সঠিকভাবে ফিরিয়ে দিচ্ছেন না।


0

আমি প্রস্তাব দিচ্ছি যে আপনার ব্যবসায়ের জিনিসগুলি কোনও ফলাফলের সেট থেকে নিজেকে বসানোর জন্য একজন নির্মাতা রয়েছে। এটি আপনার ডএল এবং ব্যবসায়ের স্তরের মধ্যবর্তী সংযোগগুলি সরিয়ে দেয়। যদি আপনি দুটি পুরোপুরি আলাদা করতে চান তবে আপনার ফলাফল সেট থেকে কলামের নাম => মান জোড়ার একটি সাধারণ মানচিত্র তৈরি করুন এবং এটি কনস্ট্রাক্টরকে দিন to

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