আর্কিটেকচারাল ভাষায় বলতে গেলে, মাইক্রোসফ্টের সত্তা ফ্রেমওয়ার্কের মতো কোনও ডাটাবেস বিমূর্ত স্তর কি আলাদা ডেটা অ্যাক্সেস স্তরটির প্রয়োজনীয়তা বাতিল করে দেয়?


11

এটি ছিল পথ

কয়েক বছর ধরে, আমি আমার সফ্টওয়্যার সমাধানগুলি এরকমভাবে সংগঠিত করেছি:

  • ডেটা অ্যাক্সেসের ব্যবসায়টি বিমূর্ত করতে ডেটা অ্যাক্সেস লেয়ার (ডাল)
  • ব্যবসায়িক লজিক স্তর (বিএলএল) ডেটা সেটগুলিতে ব্যবসায়ের বিধি প্রয়োগ করতে, প্রমাণীকরণ হ্যান্ডেল করতে পারে
  • ইউটিলিটিস (ইউটিলিটি) যা আমি সময়ের সাথে সাথে নির্মিত সাধারণ ইউটিলিটি পদ্ধতির একটি গ্রন্থাগার।
  • উপস্থাপনা স্তর যা অবশ্যই ওয়েব, ডেস্কটপ, মোবাইল, যাই হোক না কেন হতে পারে।

এখন যেভাবে চলছে

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

সুতরাং, আমি সাধারণত একটি ডাল দিয়ে শেষ করি যা এর মতো পদ্ধতিগুলির সংগ্রহ রয়েছে:

public static IQueryable<SomeObject> GetObjects(){
    var db = new myDatabaseContext();
    return db.SomeObjectTable;
}

তারপরে, বিএলএলে এই পদ্ধতিটি এইভাবে ব্যবহৃত হয়:

public static List<SomeObject> GetMyObjects(int myId){
    return DAL.GetObjects.Where(ob => op.accountId == myId).ToList();
}

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

শুধু ডালটি ছেড়ে দিয়ে আমার বিএলএল পদ্ধতিগুলি কেবল এইভাবে লেখাই ভাল হবে না:

public static List<SomeObject> GetMyObjects(int myId){
    var db = new myDatabaseContext();
    return db.SomeObjectTable.Where(ob => op.accountId == myId).ToList();
}

আমি উপরে বর্ণিত কারণে ভবিষ্যতের প্রকল্পগুলি থেকে ডাল বাদ দেওয়ার বিষয়টি বিবেচনা করছি তবে এটি করার আগে আমি কোনও প্রকল্পে রাস্তায় নামার আগে আমি যে সমস্যাটি করেছি তা আবিষ্কার করার আগে আমি আপনার সম্প্রদায়ের দৃষ্টি / দূরদৃষ্টি / মতামতের জন্য এখানে সম্প্রদায়টি পোল করতে চেয়েছিলাম ' টি অনুমান করা।

কোন চিন্তা প্রশংসা করা হয়।

হালনাগাদ

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


3
কীভাবে একটি / আপনার ডেটা অ্যাক্সেস স্তর ইএফ থেকে আলাদা? EF একটি ডেটা অ্যাক্সেস স্তর নয়? শুধু কারণ আমি তোমার বিজনেস লজিক এবং মতিন মধ্যে আপনার নিজের বিমূর্ততা রাখার দেখতে পারেন মধ্যে পরীক্ষার জন্য এবং এড়ানোর বিক্রেতা লক করা আরো সহজ stubbing করা হয়।
Marjan Venema

2
এটি আমার বক্তব্য - আমার দৃষ্টিতে কোনও পার্থক্য নেই, তবে আমি পাল্টা পয়েন্টগুলি খুঁজছি। ধন্যবাদ।
ম্যাট ক্যাস্যাট

3
ব্যক্তিগতভাবে আমি পৃথক ডাল তৈরি করার কোনও কারণ দেখি না, কারণ EF / NHibernate হ'ল তাদের মধ্যে ডেটা অ্যাক্সেস স্তর। যেমন মার্জান উল্লেখ করেছে, ইএফের সাহায্যে আপনি এটি বিবেচনা করতে পারেন যদি আপনি ডাটাবেস বিক্রেতাকে পরিবর্তন করতে দেখতে পান, এনএইচবারনেটে আপনি কোডের এক লাইনে ড্রাইভার (এমনকি মেমরি পরীক্ষার জন্য এসকিউএলাইট ড্রাইভার) অদলবদল করতে পারেন, সুতরাং এটি (আইএমও) অপ্রয়োজনীয় কোড হবে।
প্যাট্রিক ieউইক

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

1
পুনরায় আপডেট করুন: এই অতিরিক্ত স্তর অনেক সহজ কারণ উপহাস / stubbing / এর faking busineslayer এর Unittests করতে পারেন GetMyObjects(int myId)উপহাস / stubbing / এর faking তুলনায় অনেক সহজ GetObjects.Where(ob => op.accountId == myId).ToList()
k3b

উত্তর:


6

আপনি যে উত্তরটি সন্ধান করছেন এটি এটি কিনা নিশ্চিত না .. তবে এখানে চলে যায় goes

জিনিসগুলি পৃথক / সংগঠিত রাখতে আমরা এটি করি। হ্যাঁ, EF / NHibernate হ'ল ডেটা অ্যাক্সেস .. তবে আমরা জেনেরিক রিপোজিটরি সেটআপ দিয়ে এর নিজস্ব সমাবেশে এর ব্যবহার সীমাবদ্ধ করি। এই সমাবেশটিতে আমাদের সমস্ত এনহাইবারনেট ম্যাপিংস, সেশন কারখানা, একাধিক ডাটাবেস পরিচালনা করার কোড ইত্যাদি রয়েছে contains

আমরা এখনও এটিকে "ডেটা অ্যাক্সেস লেয়ার" হিসাবে উল্লেখ করি কারণ পুরো সমাবেশটি আমাদের ওআরএম সমর্থন করার জন্য বিদ্যমান।

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


2

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

ডাল এবং ইএফ কোথায় ফিট করে তা দেখানোর জন্য এখানে একটি উচ্চ-স্তরের উদাহরণ রয়েছে:

-------------    -------                                    ----------------    ------
| Service A | -> | DAL | -> { LOCAL / LAN / WAN ACCESS } -> | DAL BACK-END | -> | EF |
-------------    -------                                    ----------------    ------

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

এই নকশাটি যদিও কিছু ফাঁসযুক্ত বিমূর্ততাগুলির পরিচয় দেয়। সুতরাং এটি কেস ভিত্তিতে কেস বিবেচনা করা উচিত।

কিছু প্রশ্ন জিজ্ঞাসা:

  • আপনার ডেটা অ্যাক্সেস করা সমস্ত উপাদানগুলি কি ব্যাক-এন্ড ডেটা স্টোরের সাথে সংযোগ পেতে সক্ষম হবে?
  • আপনার EF কি আপনাকে বিভিন্ন ধরণের ডেটা স্টোর জুড়ে ডেটা সেটগুলি একত্রিত করার অনুমতি দেয়? উদাহরণস্বরূপ নথির জন্য মংগোডিবি সহ একটি এসকিউএল ডাটাবেস ব্যবহার করা।

1

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

যদি এই ধরণের পরিবর্তনের গুরুতর সম্ভাবনা থাকে তবে আপনার EF কোডটি আপনার ডালের মধ্যে বিচ্ছিন্ন রাখা মূল্যবান হতে পারে যাতে আপনি ভবিষ্যতে কোনও নতুন ডাল প্রবর্তন করতে পারেন যা কোনও নোএসকিউএল ডাটাবেসে আপনার সংগ্রহস্থলের অনুরোধগুলিকে ম্যাপ করে। এটি হতে পারে যে ডিবি সম্পর্কিত অনুমানের কারণে অবশ্যই এই ক্রাইপটি আপনার বিএলএলের একটি পাইকারি পুনর্লিখনের সাথে শেষ হবে।

একইভাবে, একটি ডালের মধ্যে ইএফ সম্ভবত আপনার বিএলএল কোড ইউনিট পরীক্ষার জন্য ডেটা অ্যাক্সেসের উপহাসকে আরও সহজবোধ্য করে তুলবে।

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

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