সংগ্রহস্থল করতে বা না সংগ্রহস্থল থেকে


10

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

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

  1. ডোমেন স্তর হ'ল সিস্টেমের কেন্দ্রস্থল, সত্তা, পরিষেবাদি, সংগ্রহস্থল সমন্বিত ...
  2. অবকাঠামো স্তর একটি অবকাঠামোগত উদ্বেগের ডোমেন ইন্টারফেসের বাস্তবায়ন সরবরাহ করে, যেমন ফাইল, ডাটাবেস, প্রোটোকল ..
  3. অ্যাপ্লিকেশন স্তরটি এমন একটি সংমিশ্রণ মূলকে হোস্ট করে যা জিনিসগুলিকে তারযুক্ত করে এবং সবকিছুকে অর্কেস্টেট করে।

আমার সমাধানগুলি সাধারণত এটির মতো দেখায়:

Domain.Module1
Domain.Module2
    IModule2Repo
    IModule2Service
    Module2
Infrastructure.Persistence
    Repositories
        EntityFrameworkRepositoryBase
MyApp
    Boostrapper
        -> inject EntityFrameworkRepositoryBase into IRepository etc.

আমি আমার ডোমেন স্তরটি এমনটি ব্যবহার করে পরিষ্কার রাখি IRepository<'T>যা একটি ডোমেন উদ্বেগ যা কোনও কিছুর উপর নির্ভর করে না যা আমাকে কীভাবে ডেটা অ্যাক্সেস করতে পারে তা বলে। যখন আমি এখন IModule2Serviceএটির একটি দৃ concrete় বাস্তবায়ন করব যাতে ডেটা অ্যাক্সেসের প্রয়োজন হয়, আমাকে ইনজেক্ট করতে হবে DbContextএবং এটির মাধ্যমে এটি সরাসরি পরিকাঠামো স্তরে সংযুক্ত করতে হবে। ( ভিসুয়াল স্টুডিও প্রকল্পের আসছে, এই বৃত্তাকার নির্ভরতা সত্যিই চতুর কারণ শেষ পর্যন্ত করতে পারেন! )

অতিরিক্তভাবে ডিপোজিটরিগুলি এবং কাজের টাকশনের বিকল্প কী হতে পারে ? CQRS? কীভাবে একজন বিশুদ্ধ অবকাঠামোগত কাঠামোটিকে বিমূর্ত করে?


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

উত্তর:


4

ইঞ্জিনিয়ারিং সব সমঝোতা সম্পর্কে। এবং তাই সফ্টওয়্যার বিকাশ। এই মুহুর্তে, আমি বিশ্বাস করি কেবলমাত্র অন্য বিকল্পটি, এটি সহজ হবে ওআরএমের সাথে সরাসরি কাজ করা। তবে আপনি যেমন বলেছিলেন, এটি আপনাকে নির্দিষ্ট দৃistence়তার কাঠামোতে লক করতে পারে।

সুতরাং আপনাকে নিজেকে জিজ্ঞাসা করতে হবে "অধ্যবসায় থেকে আপনার কোডটি ডিউপল করার অতিরিক্ত জটিলতা কি"? আমি যখনই শুনি লোকেরা বলছে যে তারা তাদের কোডটি অধ্যবসায় থেকে দ্বিগুণ করতে চান আমি জিজ্ঞাসা করি "আপনার জীবনের কতবার আপনি নিজের অধ্যবসায় কাঠামো পরিবর্তন করেছিলেন?"

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

তারপরে ইউনিট-টেস্টিং যুক্তিও রয়েছে, যার কাছে আমি বলেছি "যদি দৃ pers়তার কাঠামো আপনাকে মেমোরিতে বা স্থানীয়ভাবে কোনও ডেটাবেসকে উপহাস করার অনুমতি না দেয় তবে ফ্রেমওয়ার্কটি মোটেও ব্যবহার করার মতো নয়" "


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

একটি সামগ্রিক মূল বা যে কোনও সত্তাকে জিজ্ঞাসা করার জন্য একটি নতুন উপায় যুক্ত করার বিষয়ে , সেজন্যই সিকিউআরএস হাজির। ব্যক্তিগতভাবে, আমি ডোমেনের উদ্দেশ্যে সংরক্ষণাগার রাখি এবং প্রকৃত অনুসন্ধানের জন্য ক্যোয়ারী হ্যান্ডলারগুলি ব্যবহার করি। এবং এই হ্যান্ডলারগুলি ডিবিতে খুব দৃ to়ভাবে মিলিত হয় এবং তারা কী করে তা অত্যন্ত দক্ষ।
মাইকসডব্লিউ 6:54

3

আমি সাধারণ সংগ্রহস্থল, যদিও আমি জেনেরিক সংগ্রহস্থল নিদর্শনগুলি থেকে সরে এসেছি। পরিবর্তে আমি আমার ভান্ডারগুলি ব্যবসায়িক ক্রিয়াকলাপের সাথে সেগুলি প্রযোজ্য। সংগ্রহস্থলগুলি ওআরএম থেকে বিমূর্ত করার লক্ষ্য নয়, কারণ এটি আমার পরিবর্তনের প্রত্যাশিত কিছু নয় এবং একই সাথে আমি কোনও সংগ্রহস্থলকে খুব দানাদার তৈরি করা এড়াতে চাই না। (অর্থাত 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>প্রয়োগের প্রয়োজনের বিভিন্ন ক্ষেত্র এবং / অথবা কিছু জটিল পাস-ইন ফিল্টারিং এক্সপ্রেশনটি চেষ্টা করার এবং পরিবেশন করার জন্য বেশ কয়েকটি "গেট" পদ্ধতি অর্জন করে শেষের চেয়ে ভাল দেখতে পাই ।

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

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