ORM স্তরটির উপর বিমূর্ততার একটি স্তর তৈরি করা হচ্ছে


12

আমি বিশ্বাস করি যে আপনার যদি সংগ্রহস্থলগুলি একটি ORM ব্যবহার করে তবে এটি ইতিমধ্যে ডাটাবেস থেকে যথেষ্ট বিমূর্ত ab

যাইহোক, আমি এখন যেখানে কাজ করছি, কেউ বিশ্বাস করেন যে আমাদের একটি স্তর থাকা উচিত যা পরে ORM পরিবর্তন করতে চাইলে আমাদের ORM বিমূর্ত করে।

এটি কি সত্যিই প্রয়োজনীয় বা এটি অনেকগুলি ওআরএম-এ কাজ করবে এমন একটি স্তর তৈরি করার জন্য কেবল প্রচুর ওভার হেড?

সম্পাদন করা

কেবল আরও বিস্তারিত জানাতে:

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

3
অতিরিক্ত স্তরটির ন্যায্যতা প্রয়োজন, অন্যথায় এটি YAGNI লঙ্ঘন করে। অন্য কথায়, কেউ বিশ্বাস যে আপনি এটি প্রয়োজন, যে প্রমাণ করার একটা বোঝা হয়ে গেছে
মশা

2
আমি বুঝতে পারি যে কোনও ডোমেন স্তরটি অপারেশনগুলির কেবলমাত্র একটি সাবসেটকেই উন্মোচিত করে - ওআরএমগুলি কিছুটা প্রশস্ত একটি পৃষ্ঠের ক্ষেত্র হতে থাকে (বলুন যে আপনি কোনও সত্তা সম্বলিত কোনও সত্তার দ্বারা পরিচালিত নয় এমন কোনও সত্তার আপডেটের অনুমতি দিতে চান না)। বিমূর্তির এ জাতীয় স্তর এটিকে সাহায্য করে।
ওডে

4
আপনি যদি প্রথম স্তরটিও পরিবর্তন করতে চান তবে কেবলমাত্র ORM এর উপরে বিমূর্তকরণের প্রথম স্তরটির জন্য আপনার সম্ভবত বিমূর্ততার দ্বিতীয় স্তরের প্রয়োজন হবে।
ডেভিড পিটারম্যান

1
@ ডেভিড আমরা যখন অযৌক্তিকতা যুক্ত করছি, আপনার সমস্ত (বুলিয়ান) যদি (বুলিয়ান == সত্য) তে পরিবর্তন করুন এবং আপনি যদি আরও কিছু পুনরায় সাজতে চান তবে (বুলেটিয়ান == সত্য == সত্য ...) এবং
এরপরে

1
আকর্ষণীয় সম্পর্কিত পোস্ট: ayende.com/blog/3955/repository-is-the-new-singleton
আরমাল্ক

উত্তর:


12

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

অভ্যন্তরীণ কাঠামো প্রায় সবসময় একটি বিপর্যয় হয়। ভবিষ্যতের প্রয়োজনের প্রত্যাশায় একটি নির্মাণ করা প্রায় গ্যারান্টিযুক্ত দুর্যোগ। সফল কাঠামো সফল প্রকল্পগুলি থেকে বের করা হয়, কাল্পনিক প্রয়োজন মেটাতে সময়ের আগে নির্মিত হয় না।


12

ওআরএম আপনার ডেটা স্তরটিকে আরডিবিএমএস থেকে আলাদা করার জন্য একটি বিমূর্ততা সরবরাহ করে, তবে এটি আপনার ডেটা স্তর থেকে আপনার ব্যবসায়ের স্তরটিকে "মুক্ত" করার পক্ষে যথেষ্ট নয়। বিশেষত, আপনার আরডিবিএমএস টেবিলের মানচিত্রগুলিকে ব্যবসায়ের স্তরটিতে "ফাঁস" করতে দেওয়া উচিত নয়।

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

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

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


আমি খুব খুশি। নেট জিজ্ঞাসা অবজেক্টটি প্ল্যাটফর্মটিতে বেক করে এই সমস্যাটি সমাধান করেছে N হাইবারনেটের .NET বন্দর এমনকি এটি সমর্থন করে।
মাইকেল ব্রাউন

2
@ মাইক্রব্রাউন হ্যাঁ, এবং নেটও লিনকিউ প্রযুক্তি ব্যবহার করে দুটি নিজস্ব প্রতিযোগী ওআরএম প্রযুক্তি সরবরাহ করেছে!
dasblinkenlight

@ ডাসব্লিংকনলাইট আপনাকে অতিরিক্ত তথ্য দেওয়ার জন্য আমি প্রশ্নটি আপডেট করেছি।
প্যাট্রিক দেশজার্ডিনস

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

2

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

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

কাঠামোটি কার্যকর করা সহজ। প্রথমে আপনার জেনেরিক IRepository ইন্টারফেস রয়েছে

public interface IRepository<T>
  where T:class
{
  IQueryable<T> FindBy(Expression<Func<T,Bool>>filter);
  IQueryable<T> GetAll();
  T FindSingle(Expression<Func<T,Bool>> filter);
  void Add(T item);
  void Remove(T item);

}

এবং IUnitOfWork ইন্টারফেস

public interface IUnitOfWork
{
   IQueryable<T> GetSet<T>();
   void Save();
   void Add<T>(T item) where T:class;
   void Remove<T>(T item) where T:class;
}

পরবর্তীটি বেস সংগ্রহস্থল (এটি বিমূর্ত হওয়া উচিত কিনা তা সম্পর্কে আপনার পছন্দ)

public abstract class RepositoryBase<T>:IRepository<T>
  where T:class
{
   protected readonly IUnitOfWork _uow;

   protected RepositoryBase(IUnitOfWork uow)
   { 
      _uow=uow;
   }

   public IQueryable<T> FindBy(Expression<Func<T,Bool>>filter)
   {
      return _uow.GetSet<T>().Where(filter);
   }

   public IQueryable<T> GetAll()
   {
      return _uow.GetSet<T>();
   }

   public T FindSingle(Expression<Func<T,Bool>> filter)
   {
      return _uow.GetSet<T>().SingleOrDefault(filter);
   }

   public void Add(T item)
   {
      return _uow.Add(item);
   }

   public void Remove(T item)
   {
      return _uow.Remove(item);
   }
}

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


1
তবে এখানে প্রশ্নটি নির্ধারণ করছে যে উপরের স্তরটি কার্যকর কিনা এবং সমস্ত ডেটা অ্যাক্সেসের দ্বাররক্ষক হওয়া উচিত।
ব্রায়ান

আশা করি আমি ওয়ার্কের / ইউনিট রিপোজিটরি বাস্তবায়নের জন্য আমার ব্লগ পোস্টটিতে ইঙ্গিত করতে পারি। এটি ওপি থেকে সঠিক উদ্বেগগুলি নিয়ে আলোচনা করে।
মাইকেল ব্রাউন

স্তরটি নাম দেওয়ার অর্থ এই নয় যে এটি প্রয়োজনীয় বা দরকারী।
কেভিন cline

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

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