জেনেরিক রিপোজিটরিতে আসল সুবিধা আছে কি?


28

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

IRepository repo = new EfRepository(); // Would normally pass through IOC into constructor 
var c1 = new Country() { Name = "United States", CountryCode = "US" };
var c2 = new Country() { Name = "Canada", CountryCode = "CA" };
var c3 = new Country() { Name = "Mexico", CountryCode = "MX" };
var p1 = new Province() { Country = c1, Name = "Alabama", Abbreviation = "AL" };
var p2 = new Province() { Country = c1, Name = "Alaska", Abbreviation = "AK" };
var p3 = new Province() { Country = c2, Name = "Alberta", Abbreviation = "AB" };
repo.Add<Country>(c1);
repo.Add<Country>(c2);
repo.Add<Country>(c3);
repo.Add<Province>(p1);
repo.Add<Province>(p2);
repo.Add<Province>(p3);
repo.Save();

তবে, সংগ্রহস্থলটির বাকি বাস্তবায়নগুলির লিনকের উপর প্রচুর নির্ভরতা রয়েছে:

IQueryable<T> Query();
IList<T> Find(Expression<Func<T,bool>> predicate);
T Get(Expression<Func<T,bool>> predicate);
T First(Expression<Func<T,bool>> predicate);
//... and so on

এই সংগ্রহস্থল প্যাটার্নটি সত্ত্বা ফ্রেমওয়ার্কের জন্য দুর্দান্ত কাজ করেছে এবং DbContext / DbSet এ উপলব্ধ পদ্ধতিগুলির 1 থেকে 1 ম্যাপিংয়ের প্রস্তাব দেয়। সত্তা ফ্রেমওয়ার্কের বাইরে অন্যান্য ডেটা অ্যাক্সেস প্রযুক্তিগুলিতে লিনকের ধীর গতিতে, ডিবি কনটেক্সটটির সাথে সরাসরি কাজ করার ফলে এতে কী লাভ হবে?

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

জেনেরিক রিপোজিটরি প্যাটার্নটি কী সত্তা ফ্রেমওয়ার্কের বাইরে কোনও কিছুর জন্য কার্যকর? যদি তা না হয় তবে কেন কেউ সরাসরি এন্টি ফ্রেমওয়ার্কের সাথে কাজ করার পরিবর্তে এটিকে ব্যবহার করবে?


আসল লিঙ্কটি আমার নমুনা কোডটিতে আমি যে প্যাটার্নটি ব্যবহার করছিলাম তা প্রতিফলিত করে না। এখানে একটি ( আপডেট লিঙ্ক )।



1
প্রশ্নটি কি "জেনেরিক সংগ্রহস্থলের অগ্রযাত্রা" সম্পর্কে বা "জেনেরিক রিপোজিটরি ইন্টারফেসের পিছনে জটিল প্রশ্নগুলি কীভাবে আড়াল করবেন"? যদি এর ইন্টারফেস এবং ব্যবহার লিনকের উপর নির্ভর করে তবে জেনেরিক হওয়া কি সম্ভব? আমাদের রেপোসিটোরিপিতে একটি কোয়েরি বাই এক্সাম্পল পদ্ধতি রয়েছে যা অনুসন্ধান কৌশলটি থেকে সম্পূর্ণ স্বতন্ত্র এবং বাস্তবায়ন স্থানান্তর করতে দেয়।
k3b

"এটি আমাকে একাধিক বিভিন্ন সত্তার ধরণের জন্য একই কাজ করতে একই সংগ্রহস্থলটি ব্যবহার করতে দেয়" => এটি কি আমি বা আপনি কেবল জেনেরিক সংগ্রহস্থল (উল্লিখিত নিবন্ধের সাথে সম্পর্কিত) কী তা ভুল বোঝেন? আমার কাছে জেনেরিক সংগ্রহস্থলের সবসময় একটি একক সঙ্গে সব Repos টেমপ্লেট বোঝানো হয়েছে বর্গ বা ইন্টারফেস, একটি একক সংগ্রহস্থলের হচ্ছে না উদাহরণস্বরূপ সমস্ত সত্ত্বা যাই হোক না কেন তাদের ধরনের অধ্যবসায় পরিচালনার ...
guillaume31

উত্তর:


35

জেনেরিক সংগ্রহস্থল সত্তা ফ্রেমওয়ার্কের জন্য এমনকি অকেজো (এবং আইএমএইচওও খারাপ)। এটি ইতিমধ্যে সরবরাহিত IDbSet<T>যা (যা বিটিডব্লিউ। জেনেরিক সংগ্রহস্থল) দ্বারা কোনও অতিরিক্ত মান আনবে না ।

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

সরলিকৃত ইউনিট পরীক্ষার বিষয়ে দ্বিতীয় সাধারণ যুক্তিটিও ভুল কারণ মেমোরি ডেটা স্টোরেজ সহ মজাদার সংগ্রহস্থল / সেটটি লিনক সরবরাহকারীকে অন্য একের সাথে প্রতিস্থাপন করে যার বিভিন্ন ক্ষমতা রয়েছে। লিনক-টু-সত্তা প্রদানকারী সরবরাহকারী কেবল লিনক বৈশিষ্ট্যগুলির উপসেটটি সমর্থন করে - এটি এমনকি IQueryable<T>ইন্টারফেসে উপলব্ধ সমস্ত পদ্ধতি সমর্থন করে না । ডেটা অ্যাক্সেস স্তর এবং ব্যবসায়িক লজিক স্তরগুলির মধ্যে এক্সপ্রেশন ট্রি ভাগ করে নেওয়া ডেটা অ্যাক্সেস লেয়ারের কোনও ফেইক প্রতিরোধ করে - ক্যোয়ারী যুক্তি পৃথক করা উচিত।

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


একটি তাত্ক্ষণিক প্রশ্ন, এনএইচবারনেট ISessionসাধারণ জেনার টেস্টিংয়ের জন্য যা সহজেই বিদ্রূপযোগ্য, এবং আমি খুব খুশি ইফের সাথে কাজ করার সময় 'সংগ্রহস্থল' বাদ দিয়েছিলাম - তবে এটি পুনরায় তৈরি করার কোনও সহজ, সরলতর উপায় আছে কি? এর সদৃশ কিছু ISessionএবং এর ISessionFactoryকারণ, ' IDbContextআমি যতটা বলতে পারি তেমন কোনও কারণ নেই ...
প্যাট্রিক Ćউইক

নেই কোনও নেই IDbContext- IDbContextআপনি চাইলে কেবল একটি তৈরি করতে পারেন এবং এটি আপনার উদ্ভূত প্রসঙ্গে প্রয়োগ করতে পারেন।
লাডিস্লাভ মৃঙ্কা

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

1
ভাল উত্তর. কিছু বিকাশকারী কোনও কারণ ছাড়াই বিমূর্ততার আরও একটি স্তর তৈরি করে। আইএমও, ইএফ জেনেরিক সংগ্রহশালা বা কোনও কাজের একক (তারা
বিল্ট

1
আইডিবিসেট <T> হ'ল জেনেরিক রিপোজিটরি যা সত্তা ফ্রেমওয়ার্কের উপর নির্ভরতা থাকে যা এ জাতীয় সত্তা ফ্রেমওয়ার্কের উপর নির্ভরশীলতা দূরে রাখতে জেনেরিক সংগ্রহশালা ব্যবহারের উদ্দেশ্যকে হ্রাস করে।
জোয়েল ম্যাকবেথ

7

সমস্যাটি সংগ্রহস্থলের ধরণ নয় isn't ডেটা পাওয়ার ক্ষেত্রে এবং কীভাবে আপনি এটি পাচ্ছেন তার মধ্যে বিমূর্ততা থাকা ভাল জিনিস।

বিষয়টি এখানে বাস্তবায়ন। ধরে নিই যে ফিল্টারিংয়ের জন্য একটি স্বেচ্ছাসেবী অভিব্যক্তি কাজ করবে তা ডাইসাই সেরা।

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


সুতরাং GetById (int id), সোর্টার্ডলিস্ট () ইত্যাদির মতো নির্দিষ্ট পদ্ধতির সাথে প্রতি ডাটা অবজেক্টের প্রতি ভাণ্ডার, বা দৃ tight়ভাবে সম্পর্কিত অবজেক্টগুলির একটি গোষ্ঠী থাকা আরও বোধগম্য হয়? আমি কি কোনও সংগ্রহস্থল থেকে ডেটা অবজেক্টের তালিকাগুলি ফিরিয়ে দিচ্ছি, বা প্রয়োজনীয় ক্ষেত্রগুলি দিয়ে সেগুলিকে ব্যবসায়িক সামগ্রীতে রূপান্তর করছি? কিন্ডা ভেবেছিলেন পরিষেবা / ব্যবসায়ের স্তরে যা ঘটেছিল।
স্যাম

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

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

@ এরিকিং আমার কাছেও রয়েছে, এবং এটি খুব ভাল ছিল, তবে এটি কিছু বিমূর্ততা ফাঁস করে দেয় যেহেতু সাধারণ স্টাফগুলি কেবল কীভাবে ডেটা সংরক্ষণ করা হয় তার সাধারণতার কারণেই উপস্থিত থাকে Get
টেলাস্টিন

@ টেলাস্টিন হ্যাঁ, আমি এটির সাথে একমত হব, তবে এটি নির্দিষ্ট সঞ্চিত্রেও ঘটে happens ফাঁস বিমূর্ততা জেনেরিক সংগ্রহস্থলের জন্য নির্দিষ্ট নয়। (বাহ, আমি কি আরও উদ্ভট কিছু বলতে পারি?)
এরিক কিং

2

জেনেরিক ডেটা স্তরের মান (একটি সংগ্রহস্থল একটি নির্দিষ্ট ধরণের ডেটা স্তর) কোডটি কোডিং কোডের উপর সামান্য বা কোনও প্রভাব ছাড়াই অন্তর্নিহিত স্টোরেজ পদ্ধতিটি পরিবর্তন করতে দেয়।

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

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

[সম্পাদনা করুন: নিম্নলিখিত যুক্ত করা হয়েছে।]

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


1

ডাটাবেসের উপরে একটি কোড স্তর থাকা প্রায় সব ক্ষেত্রেই সার্থক। আমি সাধারণভাবে বর্ণিত কোডটিতে একটি "গেটবাইএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স" প্যাটার্নটি পছন্দ করবো - এটি ইউআইআইকে ডেটা ইন্টারফেসের বিশৃঙ্খলা থেকে মুক্ত রাখার সময় আপনার প্রয়োজন অনুসারে ক্যোয়ারীগুলি অনুকূল করতে দেয়।

জেনেরিকের সুবিধা গ্রহণ করা অবশ্যই নিখুঁত খেলা - একটি Load<T>(int id)পদ্ধতি থাকা অর্থপূর্ণ করে তোলে। তবে লিনকিউ-এর আশেপাশে সংগ্রহস্থলগুলি হ'ল 2010 এর দশকের সমতুল্য যেহেতু কিছুটা যুক্ত ধরণের সুরক্ষা সহ সর্বত্র স্কয়ার কোয়েরিগুলি ফেলে দেওয়া।


0

ঠিক আছে, সরবরাহিত লিঙ্কটি দিয়ে আমি দেখতে পাচ্ছি যে এটি কোনওটির জন্য একটি সহজ র‍্যাপার হতে পারে DataServiceContextতবে কোড ম্যানিপুলেশনগুলি হ্রাস করে না বা পাঠযোগ্যতার উন্নতি করে না। তদ্ব্যতীত, অ্যাক্সেস DataServiceQuery<T>বাধাগ্রস্ত হয় .Where()এবং এতে নমনীয়তা সীমাবদ্ধ করে .Single()। তাছাড়াও হয় AddRange()বা বিকল্প প্রদান করা হয়েছে। বা Delete(Predicate)সরবরাহ করা যায় না যা কার্যকর হতে পারে ( repo.Delete<Person>( p => p.Name=="Joe" );জো-গুলি মুছতে)। প্রভৃতি

উপসংহার: এই জাতীয় একটি এপিআই নেটিভ এপিআইকে বাধা দেয় এবং এটিকে কয়েকটি সাধারণ ক্রিয়াকলাপে সীমাবদ্ধ করে।


আপনি সঠিক. এটি আমার নমুনা কোডটিতে থাকা প্যাটার্নটি ব্যবহার করে নিবন্ধটি নষ্ট করবে না। আমি বাড়ি এলে লিঙ্কটি সন্ধান করার চেষ্টা করব।
স্যাম

আপডেটের লিঙ্কটি প্রশ্নের নীচে যুক্ত হয়েছে।
স্যাম

-1

আমি "হ্যাঁ" বলতাম। আপনার ডেটা মডেলের উপর নির্ভর করে একটি উন্নত জেনেরিক রিপোজিটরি ডেটা অ্যাক্সেসকে টায়ার লাইনার, আরও সুন্দর এবং আরও অনেক শক্তিশালী করে তুলতে পারে।

এই সিরিজের নিবন্ধগুলি পড়ুন ( @ ক্রিস-প্র্যাট দ্বারা ):

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