সত্ত্বা ফ্রেমওয়ার্ক এবং অ্যানমিক ডোমেন মডেল এড়ানো


11

আমাদের ব্যবসায়িক যুক্তিতে আমরা মাঝে মাঝে পদ্ধতিগুলির এমন কিছু সংজ্ঞায়িত করে থাকি:

User.ResetCourse(Course courseToReset)

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

এটি সমাধানের জন্য আমরা স্বাক্ষরটি এতে পরিবর্তন করেছি:

User.ResetCourse(MyDBContext db, Course courseToReset)

এর অর্থ আমরা একটি দক্ষ পদ্ধতিতে আমাদের প্রয়োজনীয় পরিবর্তনগুলি করার জন্য সরাসরি ডাটাবেসকে জিজ্ঞাসা করতে পারি তবে একটি ব্যবসায়িক আইটেমে ডাটাবেস প্রসঙ্গটি পাস করা ঠিক ততটা ভুল বলে মনে হয়।

আমরা পরে ব্যবহারকারীর কাছে একটি পরিষেবা স্তরে স্থানান্তরিত হয়ে গেলাম যার অর্থ আমাদের কাছে এমন কিছু রয়েছে:

CourseService.ResetForUser(Course courseToReset, User forUser)

এই পরিষেবাদির তৈরিতে ইনজেকশন করা DBContext এর একটি উল্লেখ রয়েছে তবে এখন আমাদের ব্যবসায়িক অবজেক্টগুলি কোনও আচরণ ছাড়াই কেবল ডেটা ব্যাগ (যেমন একটি অ্যানিমিক ডোমেন মডেল)।

আমরা কীভাবে এড়াতে পারি?


11
ধরণের শোনার মতো আপনি সুনির্দিষ্টভাবে আঘাত পেয়েছেন যে সত্তা ফ্রেমওয়ার্ক মডেলগুলি আসলে ডিটিও এবং সত্যই কোনও ডোমেন মডেল নয়। আপনি কি আসলেই ডিডিডি করার চেষ্টা করছেন? যদি না হয়, এটি সম্ভবত কিছু যায় আসে না।
মিঃ কোচিজ

3
এডিএম প্লাস পরিষেবাগুলি প্রচুর জিনিসের জন্য একটি ভাল আর্কিটেকচার
ইওয়ান


2
@ জনউউ এটি একটি অত্যন্ত পক্ষপাতমূলক নিবন্ধ। প্রকৃতপক্ষে এটি সমৃদ্ধ উদাহরণে অ্যাক্টিভ রেকর্ড প্যাটার্নটি অন্তর্ভুক্ত করে একটি সমৃদ্ধ ডোমেন মডেলের একটি "স্ট্রোম্যান" সংস্করণ ধারণ করে। অবশ্যই, সক্রিয় রেকর্ডটি ডিডিডি তে প্রচ্ছন্ন নয় এবং সাধারণভাবে কোনও জটিল অ্যাপ্লিকেশনটির জন্য একটি দুর্বল পছন্দ।
রিবাল্ডএডি এডি

উত্তর:


8

ইস্যুটি হ'ল, আপনি EF অবজেক্টগুলি ডোমেন অবজেক্ট হিসাবে প্রথমে ব্যবহার করছেন। EF অবজেক্টগুলি ডেটা মডেল নয় ব্যবসায়িক মডেল।

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


0

আপনি সম্ভবত এ জাতীয় কিছু এড়াতে পারেন:

CourseService.prepareForUserCourseReset(DBContext db);
User.reset();
Course.reset();
CourseService.completeUserCourseReset(DBContext db);

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


-1

Ditionতিহ্যগতভাবে, এটি প্রতিটি ব্যবহারের ক্ষেত্রে আনার কৌশল ব্যবহার করে সমাধান করা হয় যা আইকিউয়ারেবল.আইনক্লুড () ব্যবহার করে প্রাথমিক ক্যোয়ারিতে প্রয়োজনীয় সংস্থানগুলি আগ্রহীভাবে লোড করার জন্য সত্তা ফ্রেমওয়ার্ককে নির্দেশ দেয়।

উদি দহন একটি পোস্ট লিখেছিলেন যা সাধারণ পদ্ধতির বর্ণনা দেয়, যা সত্তা ফ্রেমওয়ার্কের সাথে মানিয়ে নেওয়া যায়।

http://udidahan.com/2007/09/16/fetching-strategy-nhibernate-implementation-available/

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