EF 4.1 সহ জেনেরিক রিপোজিটরিটি কী is


145

আমি যখন ডিবি কনটেক্সট, ডিবিসেট এবং সম্পর্কিত ইন্টারফেসগুলিতে আরও গভীরভাবে খনন করছি, আমি ভাবছি যে কেন এই বাস্তবায়নগুলির চারপাশে আপনাকে একটি পৃথক "জেনেরিক" সংগ্রহস্থলটি প্রয়োগ করতে হবে?

দেখে মনে হচ্ছে DbContext এবং IDbSet আপনার যা কিছু প্রয়োজন তা করেন এবং DbContext এর মধ্যে "ইউনিট অফ ওয়ার্ক" অন্তর্ভুক্ত করেন।

আমি কি এখানে কিছু মিস করছি বা মনে হচ্ছে লোকেরা অকারণে নির্ভরতার অন্য স্তর যুক্ত করা উপভোগ করছে।


এটি কিছুটা বিতর্কিত / মতামত ভিত্তিক সমস্যা। আমি এখানে এটি নিয়ে আলোচনা করেছি ।
অমিত জোশী

উত্তর:


202

আপনি আসলে ঠিক বলেছেন। DbContextকাজের প্যাটার্নের এককের IDbSetবাস্তবায়ন এবং এটি সংগ্রহস্থলের প্যাটার্নের একটি বাস্তবায়ন।

সংগ্রহস্থলগুলি বর্তমানে খুব জনপ্রিয় এবং অতিরিক্ত ব্যবহৃত। প্রত্যেকে এগুলি কেবলমাত্র এজন্য ব্যবহার করে যে সত্তা কাঠামোর জন্য ভান্ডার তৈরির বিষয়ে কয়েক ডজন নিবন্ধ রয়েছে তবে এই সিদ্ধান্তের সাথে সম্পর্কিত চ্যালেঞ্জগুলি আসলে কেউ বর্ণনা করে না।

সংগ্রহস্থল ব্যবহারের প্রধান কারণগুলি হ'ল:

  • উপরের স্তর থেকে EF লুকান
  • কোডটিকে আরও ভাল পরীক্ষামূলক করে তোলেন

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

একই সময়ে ইএফ কোডটি মোড়ানো আপনার কোডকে আরও সুসংগঠিত রাখতে এবং উদ্বেগের বিধি বিচ্ছেদ অনুসরণ করতে পারে। আমার জন্য এটি रिपিজিটরি এবং কাজের ইউনিটের একমাত্র আসল সুবিধা হতে পারে তবে আপনাকে বুঝতে হবে যে EF এর সাথে এই বিধি অনুসরণ করা আপনার কোডটি আরও ভাল রক্ষণাবেক্ষণযোগ্য এবং আরও ভাল পঠনযোগ্য করে তুলবে তবে আপনার অ্যাপ্লিকেশন তৈরির প্রাথমিক প্রচেষ্টায় অনেক বেশি হবে এবং ছোট অ্যাপ্লিকেশনগুলির জন্য এটি অপ্রয়োজনীয় জটিলতা হতে পারে।

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

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


3
আপনি উপহাস IDbSetকরতে পারেন আপনি আপনার উত্পন্ন প্রসঙ্গে কাস্টম ইন্টারফেসও সংজ্ঞায়িত করতে পারেন তবে সব কিছু। আপনার কোডটি একবার চেঞ্জট্র্যাকার, এন্ট্রি বা অন্য কোনটি ব্যবহার করে সেগুলি মুড়ে ফেলার জন্য বড় পরিশ্রমের প্রয়োজন হবে।
লাদিস্লাভ মৃঙ্কা

1
হ্যাঁ ইএফ খুব কার্য সম্পাদন ভিত্তিক সরঞ্জাম নয়। কমপক্ষে এমএসের ভবিষ্যতের সংস্করণগুলিতে এটিকে আরও উন্নত করার জন্য প্রচুর সুযোগ রয়েছে।
লাডিস্লাভ মৃঙ্কা

2
@ চিচকোডোরো: ঠিক আছে। তবে একবার যদি আপনার উপহাস করা শ্রেণিটি প্যারামিটার হিসাবে প্রকাশিত হয় IQueryableবা Expression<>স্বীকৃতি দেয় যা অভ্যন্তরীণভাবে লিনক-টু-সত্তা কোয়েরিতে রাখা হয় তবে আপনি পার্শ্ব প্রতিক্রিয়া সহ বিদ্রূপকারী উপাদানটির বাইরে যুক্তি সংজ্ঞায়িত করছেন যা ইউনিট পরীক্ষার মাধ্যমে পরীক্ষা করা যায় না।
লাডিস্লাভ Mrnka

8
আমি যদি সরাসরি আমার ব্যবসায়ের স্তরে DbSet এবং BdContext ব্যবহার করি তবে আমাকে সেখানে EntityFramework.dll উল্লেখ করতে হবে পাশাপাশি আমার ডেটা লায়ার প্রকল্পে। এটি একাই আমাকে বলে যে এটির জন্য কিছু প্রকারের মোড়ক প্রয়োজন।
ইংগ ভ্যালস

2
ডাউনভোট: অসম্পূর্ণ - একটি রেপোজিটরি ইন্টারফেসের পিছনে EF বিমূর্ত করা SL এবং WPF উভয় ক্ষেত্রে একই ক্লায়েন্ট কোড চালাতে পারে।
এইচ.এলেক্স

21

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

http://refactorthis.wordpress.com/2011/05/31/mock-faking-dbcontext-in-entity-framework-4-1-with-a-generic-repository/


5

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

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

(আমি এনএইচবারনেট ব্যবহার করেছি কারণ আমরা ইসসারিগুলির সাথে সংযোগ করছি, এবং সেই সময়, ইসারিগুলির সাথে ইএফ ব্যবহার করে কোনও ব্যয় সংবেদনশীল বাস্তবায়ন ছিল না available কেবলমাত্র তাদের ডিবি 2 সংযোগের জন্য আইবিএমকে ,000 12,000 প্রদান করা হয়েছিল)


"প্রায়" (ডিবিএসেট এবং ডিবি কনটেক্সট গোপনের বিষয়ে) আপনি দেখতে পাবেন যে আপনাকে কোনও গ্রাহকের কাছে ইএফ প্রকাশের দরকার নেই (উদাহরণস্বরূপ যদি আপনি ডিআইয়ের উত্তোলন করেন) তবে আপনার একটি ইন্টারফেসের প্রয়োজন যা আইডিবিসেট <T> বৈশিষ্ট্যগুলি প্রকাশ করে বা আরও এক ধাপ এগিয়ে যান এবং এর পরিবর্তে আপনার সমস্ত সম্পত্তি আইকিউয়েরেবল <টি> এর হিসাবে টাইপ করুন, তবে আমার বক্তব্যটি হ'ল আপনি ডিবিসেট এবং ডিবি কনটেক্সটে আপনার নির্ভরতা পুরোপুরি গোপন করতে পারেন। সিআরইউডি অপগুলি তখন এক্সটেনশন পদ্ধতি হিসাবে লেখা যেতে পারে, আপনি বিভিন্ন ব্যাকিং স্টোরের জন্য একাধিক এক্সটেনশন পদ্ধতি লিখতে পারেন। তবে আপনি লিনকিউ-র ব্যবহার গোপন করবেন না।
শান উইলসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.