আমি সাধারণ সংগ্রহস্থল, যদিও আমি জেনেরিক সংগ্রহস্থল নিদর্শনগুলি থেকে সরে এসেছি। পরিবর্তে আমি আমার ভান্ডারগুলি ব্যবসায়িক ক্রিয়াকলাপের সাথে সেগুলি প্রযোজ্য। সংগ্রহস্থলগুলি ওআরএম থেকে বিমূর্ত করার লক্ষ্য নয়, কারণ এটি আমার পরিবর্তনের প্রত্যাশিত কিছু নয় এবং একই সাথে আমি কোনও সংগ্রহস্থলকে খুব দানাদার তৈরি করা এড়াতে চাই না। (অর্থাত CRUD) এর পরিবর্তে আমার সংগ্রহাগুলি দুটি থেকে তিনটি মূল উদ্দেশ্যে পরিবেশন করে:
- তথ্য পুনরুদ্ধার
- ডেটা তৈরি
- হার্ড মুছে ফেলা
ডেটা পুনরুদ্ধারের জন্য, সংগ্রহশালা সর্বদা ফিরে আসে IQueryable<TEntity>
। ডেটা তৈরির জন্য এটি TEntity প্রদান করে। সংগ্রহস্থলটি আমার বেস-স্তরের ফিল্টারিং যেমন নরমাল মুছে ফেলা ব্যবহার করে এমন সিস্টেমগুলির জন্য অনুমোদন "সক্রিয়" অবস্থা এবং stateতিহাসিক ডেটা ব্যবহার করে এমন সিস্টেমগুলির জন্য "বর্তমান" অবস্থা হিসাবে পরিচালনা করে as প্রয়োজনীয় উল্লেখগুলি সমাধান করা এবং সম্পর্কিত করা হয়েছে এবং সত্তাটি সেট আপ হয়েছে এবং যেতে প্রস্তুত রয়েছে তা নিশ্চিত করার জন্য কেবল ডেটা তৈরিই দায়বদ্ধ।
ডেটা আপডেট হ'ল প্রশ্নযুক্ত সত্তা (গুলি) এর সাথে কাজ করা ব্যবসায়িক যুক্তির দায়িত্ব। এর মধ্যে বৈধতা নিয়মের মতো জিনিস অন্তর্ভুক্ত থাকতে পারে। আমি এটি কোনও সংগ্রহস্থল পদ্ধতিতে এনক্যাপসুলেট করার চেষ্টা করি না।
আমার বেশিরভাগ সিস্টেমে মুছে ফেলা সফট-ডিলিট তাই এটি ডেটা আপডেটের আওতায় পড়বে। (ইসএ্যাকটিভ = মিথ্যা) হার্ড-মুছে ফেলার ক্ষেত্রে এটি रिपোরিটরিতে এক-লাইনার হবে।
ভান্ডার কেন? টেস্ট-ক্ষমতা। অবশ্যই, DbContext উপহাস করা যেতে পারে, তবে ফিরে আসা কোনও শ্রেণিকে উপহাস করা সহজIQueryable<TEntity>
। তারা ইউওডাব্লু প্যাটার্নের সাথেও দুর্দান্ত খেলছে, ব্যক্তিগতভাবে আমি মেডিডেমের ডিবিকন্টেক্সটস্কোপ প্যাটার্নটি আমার পছন্দ স্তরের কাজের ইউনিট (এমভিসিতে নিয়ন্ত্রণকারী) বাছাই করার জন্য ব্যবহার করি এবং আমার কন্ট্রোলার এবং সহায়ক পরিষেবা শ্রেণিগুলিকে রেফারেন্সগুলি পাস করার প্রয়োজন ছাড়াই সংগ্রহস্থলগুলি ব্যবহার করতে দিন চারপাশে ইউওডাব্লু / ডিবি কনটেক্সট। আইকিউয়েরেবল ব্যবহারের অর্থ হ'ল আপনার সংগ্রহশালায় প্রচুর মোড়কের পদ্ধতি দরকার নেই এবং আপনার কোড কীভাবে ডেটা গ্রাস হতে চলেছে তা অনুকূলিত করতে পারে। উদাহরণস্বরূপ, সংগ্রহস্থলটির "অস্তিত্ব" বা "গণনা" এর মতো পদ্ধতি উন্মোচন করার দরকার নেই বা আপনি যেখানে ডেটা উপ-সেট চান সে ক্ষেত্রে অন্যান্য পোকোগুলির সাথে সত্ত্বাগুলি মোড়ানোর চেষ্টা করবেন না। এমনকি আপনার প্রয়োজন হতে পারে বা নাও পারে এমন সম্পর্কিত ডেটার জন্য তাদের আগ্রহী-লোডিং বিকল্পগুলি পরিচালনা করার প্রয়োজন নেই। আইকিউয়েরেবল পাস করার মাধ্যমে, কলিং কোডটি এটি করতে পারে:
.Any()
.Count()
.Include() // Generally avoided, instead I use .Select()
.Where()
.Select(x => new ViewModel or Anon. Type)
.Skip().Take()
.FirstOrDefault() / .SingleOrDefault() / .ToList()
খুব নমনীয়, এবং একটি পরীক্ষার পিওভি থেকে আমার উপহাসকৃত সংগ্রহস্থলকে কেবল জনবহুল সত্তা অবজেক্টের তালিকা ফিরিয়ে আনতে হবে।
জেনেরিক সংগ্রহস্থলগুলির জন্য, আমি বেশিরভাগ অংশের জন্য এগুলি থেকে সরে এসেছি কারণ আপনি যখন টেবিলের ভিত্তিতে একটি সংগ্রহস্থলটি শেষ করেন তখন আপনার নিয়ন্ত্রক / পরিষেবাদিগুলি একটি ব্যবসায়িক ক্রিয়াকলাপ করার জন্য কয়েকটি সংগ্রহস্থলের রেফারেন্স সহ শেষ হয়। বেশিরভাগ ক্ষেত্রে এইগুলির মধ্যে একটি বা দু'টি প্রকৃতপক্ষে প্রকৃতপক্ষে রাইটিং অপারেশন করছে (আপনি যদি নেভিগেশন বৈশিষ্ট্যগুলি যথাযথভাবে ব্যবহার করছেন) তবে বাকিরা রিডের সাথে সমর্থন করে। আমার কাছে অর্ডারস রিপোজিটরির মতো কিছু রয়েছে যা অর্ডার পড়তে ও তৈরি করতে এবং কোনও অর্ডার তৈরি করার সময় কোনও প্রাসঙ্গিক লুকআপ ইত্যাদি পড়তে (হালকা ওজনের গ্রাহক অবজেক্টস, পণ্য ইত্যাদি) পড়ার পক্ষে 5 বা different টি ভিন্ন সংগ্রহস্থলকে আঘাত করার চেয়ে পছন্দ করে। এটি ডিএনআরওয়াই পিউরিস্টদের লঙ্ঘন করতে পারে, তবে এর জন্য আমার যুক্তি হ'ল সংগ্রহস্থলের উদ্দেশ্য অর্ডার তৈরি করা যা সম্পর্কিত তথ্যাদি অন্তর্ভুক্ত করে।Repository<Product>
পণ্য পেতে যেখানে একটি আদেশের ভিত্তিতে আমার কেবল কয়েকটি মুঠো ক্ষেত্রের সত্তা প্রয়োজন। আমার অর্ডাররেপোসিটরিতে একটি .GetProducts()
পদ্ধতি ফিরে আসতে পারে IQueryable<ProductSummary>
যা আমি Repository<Product>
প্রয়োগের প্রয়োজনের বিভিন্ন ক্ষেত্র এবং / অথবা কিছু জটিল পাস-ইন ফিল্টারিং এক্সপ্রেশনটি চেষ্টা করার এবং পরিবেশন করার জন্য বেশ কয়েকটি "গেট" পদ্ধতি অর্জন করে শেষের চেয়ে ভাল দেখতে পাই ।
আমি সহজ কোডটি অনুসরণ করি যা অনুসরণ করা, পরীক্ষা করা এবং টিউন করা সহজ। এটি খারাপ উপায়ে অপব্যবহার করা যেতে পারে তবে কোডটি এমনভাবে "লকড" করার চেষ্টা করার চেয়ে অপব্যবহারগুলি স্পট করা সহজ এবং সঠিক হওয়া সত্ত্বেও আমার কাছে এমন কিছু থাকত যা এটিকে ব্যর্থ করা যায় না, এবং তারপরে এমন কিছু থাকে যা শেষ পর্যন্ত ক্লায়েন্টকে যা প্রদান করতে হবে তার আসলে কী তা পাওয়ার জন্য একটি দুঃস্বপ্ন। :)