আমি ভাবছি কারণ এটি যদি হয় তবে স্তরগুলির মধ্যে ডেটা স্থানান্তর করতে একই বৈশিষ্ট্য সহ একটি নতুন অবজেক্ট তৈরি করার জন্য সত্তা ফ্রেমওয়ার্ক কেন যুক্তি সরবরাহ করে না?
সত্তার কাঠামোর সাহায্যে উত্পন্ন সত্তা অবজেক্টগুলি আমি ব্যবহার করি।
আমি ভাবছি কারণ এটি যদি হয় তবে স্তরগুলির মধ্যে ডেটা স্থানান্তর করতে একই বৈশিষ্ট্য সহ একটি নতুন অবজেক্ট তৈরি করার জন্য সত্তা ফ্রেমওয়ার্ক কেন যুক্তি সরবরাহ করে না?
সত্তার কাঠামোর সাহায্যে উত্পন্ন সত্তা অবজেক্টগুলি আমি ব্যবহার করি।
উত্তর:
এটা আপনার উপরে।
বেশিরভাগ লোক আপনাকে বলবে যে এটি একটি ভাল অনুশীলন নয় তবে আপনি কিছু ক্ষেত্রে এটি থেকে দূরে সরে যেতে পারেন।
EF একাধিক কারণে কখনই DDD এর সাথে সুন্দরভাবে খেলেনি, তবে দুটি স্ট্যান্ড আউট: আপনার সত্ত্বায় প্যারামিটারাইজড কনস্ট্রাক্টর থাকতে পারবেন না এবং আপনি সংগ্রহগুলি এমপ্ল্যাপুলেট করতে পারবেন না। ডিডিডি এতে নির্ভর করে, যেহেতু ডোমেন মডেলটিতে ডেটা এবং আচরণ উভয়ই অন্তর্ভুক্ত করা উচিত।
একরকমভাবে, EF আপনাকে অ্যানিমিক ডোমেন মডেল তৈরি করতে বাধ্য করে এবং এক্ষেত্রে আপনি সত্তাকে ডিটিও হিসাবে ব্যবহার করতে পারেন। আপনি যদি নেভিগেশন বৈশিষ্ট্যগুলি ব্যবহার করেন তবে আপনি কিছু সমস্যার সমাধান করতে পারেন তবে আপনি সেই সত্ত্বাগুলি সিরিয়াল করতে এবং সেগুলি তারের মাধ্যমে প্রেরণ করতে পারেন। এটি যদিও ব্যবহারিক নাও হতে পারে। আপনার প্রত্যেকটি সত্তার ক্রমিকায়ন নিয়ন্ত্রণ করতে হবে যার এমন বৈশিষ্ট্য রয়েছে যা আপনাকে পাঠাতে হবে না। সহজ উপায় হ'ল ডেটা স্থানান্তরের জন্য উপযুক্তভাবে আলাদা ক্লাসগুলি ডিজাইন করা। অটোম্যাপারের মতো গ্রন্থাগারগুলি এই উদ্দেশ্যে তৈরি করা হয়েছে।
উদাহরণস্বরূপ: ধরুন আপনার Person
সাথে নিম্নলিখিত সংজ্ঞা সহ একটি ক্লাস ডাকা হয়েছে :
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; get; }
// plus a bunch of other properties relevant about a person
}
ধরে নেওয়া যাক কোথাও কর্মচারীদের একটি তালিকা প্রদর্শন করাতে চান, এটা ঠিক পাঠাতে ব্যবহারিক হতে পারে Id
, FirstName
এবং LastName
। তবে আপনাকে অন্য সমস্ত অপ্রাসঙ্গিক সম্পত্তি পাঠাতে হবে। আপনি প্রতিক্রিয়ার আকার সম্পর্কে চিন্তা না করলে এটি কোনও সমস্যার পক্ষে বড় বিষয় নয় তবে সাধারণ ধারণাটি কেবল প্রাসঙ্গিক ডেটা প্রেরণ করা। অন্যদিকে, আপনি এমন একটি এপিআই ডিজাইন করতে পারেন যা ব্যক্তিদের একটি তালিকা ফেরত দেয় এবং সেই ক্ষেত্রে সমস্ত সম্পত্তি প্রেরণের প্রয়োজন হতে পারে, যাতে এই বিষয়গুলি ক্রমিক করে সত্তা প্রেরণ করা যায়। এই ক্ষেত্রে, একটি ডিটিও ক্লাস তৈরি করা বিতর্কযোগ্য। কিছু লোক সত্তা এবং ডিটিওগুলিকে মিশ্রিত করতে পছন্দ করে, কিছু লোক তা পছন্দ করে না।
আপনার আপডেট হওয়া প্রশ্নের উত্তর দিতে, EF একটি ORM। এর কাজটি হ'ল ডাটাবেস রেকর্ডগুলিকে অবজেক্টগুলিতে ম্যাপ করা এবং বিপরীতে। EF এর মধ্য দিয়ে যাওয়ার আগে এবং পরে আপনি এই জিনিসগুলি দিয়ে কী করবেন তা উদ্বেগের অংশ নয়। না হওয়া উচিত।
না এটা না.
আদর্শভাবে, ডিটিওগুলি আপনার অধ্যবসায় সংগ্রহস্থলের সাথে মিলবে (ওরফে, আপনার ডাটাবেস সারণী)।
তবে আপনার ব্যবসায়ের ক্লাসগুলি কোনও ম্যাচ নয়। আপনার অতিরিক্ত ক্লাসের প্রয়োজন হতে পারে, বা আলাদা হওয়া, বা ক্লাসে যোগ হওয়া আপনার ডেটাবেজে থাকতে পারে। যদি আপনার অ্যাপ্লিকেশনটি ছোট হয় তবে আপনি সম্ভবত এই ধরণের সমস্যা দেখতে পাবেন না তবে মাঝারি থেকে বড় অ্যাপ্লিকেশনগুলিতে এটি প্রায়শই ঘটে।
আরেকটি বিষয় হ'ল ডিটিওগুলি যে-যা দৃ pers়তার সাথে ডিল করে তার ডোমেনের অংশ, যখন আপনার ব্যবসায়ের স্তরটি তাদের সম্পর্কে কিছুই জানে না।
এটি আসলে খুব খারাপ ধারণা। মার্টিন ফওলারের স্থানীয় ডিটিও সম্পর্কিত একটি নিবন্ধ রয়েছে ।
দীর্ঘ গল্প সংক্ষেপে, DTO
প্যাটার্নটি প্রক্রিয়াটির বাইরে ডেটা স্থানান্তর করার জন্য ব্যবহৃত হয়েছিল, উদাহরণস্বরূপ তারের উপর দিয়ে এবং একই প্রক্রিয়ার মধ্যে স্তরগুলির মধ্যে নয়।
না, এটি একটি খারাপ অভ্যাস।
কিছু কারণ:
@JsonIgnore
জাভা বিশ্ব থেকে) ব্যবহার করে ক্ষেত্রগুলি উপেক্ষা করতে পারেন , তবে এটি পরবর্তী সমস্যার দিকে নিয়ে যায় ...get
সত্তার একটি পদ্ধতি কল করতে ।সুতরাং, এই কাজটিতে আপনাকে সহায়তা করার জন্য কোনও ডিটো-তে সত্তা ক্ষেত্রগুলি ম্যাপিং করা সহজ এবং নিরাপদ কোনও ধরণের ম্যাপার সরঞ্জাম ব্যবহার করুন।
@ ডেরিক যা বলেছিলেন তা পূরণ করতে, সত্তা অবজেক্টগুলিকে ডেটা স্থানান্তর অবজেক্ট হিসাবে ব্যবহারের প্রধান সমস্যাগুলি হ'ল:
কোনও লেনদেনে, আপনি আপনার সত্তায় পরিবর্তনগুলি করার ঝুঁকি নেন কারণ আপনি এটি ডিটিও হিসাবে ব্যবহার করেন (এমনকি যদি আপনি কোনও লেনদেনে সেশনের সত্তাকে বিচ্ছিন্ন করতে পারেন, বেশিরভাগ সময় আপনাকে আগে এই অবস্থাটি পরীক্ষা করতে হবে) আপনার সত্তা-ডিটিওতে যে কোনও পরিবর্তন রয়েছে এবং নিশ্চয়তা দিন যে আপনি কোনও লেনদেন করছেন না বা আপনি যদি পরিবর্তনগুলি বজায় রাখতে চান না তবে সেশনটি বন্ধ হয়ে গেছে)।
আপনি ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটার আকারটি ভাগ করেন: কখনও কখনও আপনি অনুরোধের প্রতিক্রিয়াটির আকার হ্রাস করতে ক্লায়েন্টের কাছে কোনও সত্তার সমস্ত সামগ্রী প্রেরণ করতে চান না। সত্তা থেকে ডিটিওকে পৃথক করা আরও নমনীয়, যাতে আপনি নির্দিষ্ট ব্যবহারের ক্ষেত্রে যে ডেটা প্রেরণ করতে চান সেই ডেটা বিশেষজ্ঞ করতে পারেন।
দৃশ্যমানতা এবং রক্ষণাবেক্ষণ: আপনাকে নিজের সত্তার ক্ষেত্রগুলিতে আপনার জেপিএ / হাইবারনেট টীকাগুলি পরিচালনা করতে হবে এবং একই জায়গায় জসনতে সিরিয়ালাইজ করার জন্য জ্যাকসন টীকাগুলি বজায় রাখতে হবে (এমনকি যদি আপনি তাদের উত্তরাধিকারসূত্রে প্রাপ্ত ইন্টারফেসে রাখার ক্ষেত্রে সত্তা বাস্তবায়ন থেকে আলাদা করতে পারেন তবেও সত্তা)। তারপরে, আপনি যদি কোনও নতুন ক্ষেত্র যুক্ত করার ক্ষেত্রে আপনার ডিটিও বিষয়বস্তু পরিবর্তন করেন তবে অন্য কোনও ব্যক্তি সম্ভবত এটি সত্তার ক্ষেত্র, এটি আপনার ডেটাবেজে সংশ্লিষ্ট টেবিলের ক্ষেত্রটি ভাবতে পারে (এমনকি আপনি যদি আপনার @Transient
সমস্ত ডিটিও ক্ষেত্রে টীকা ব্যবহার করতে পারেন তবে মামলার জন্য ..!)।
আমার মতে, আপনি সত্তাটি পড়ার সময় শব্দটি তৈরি হয় তবে আমার মতামত অবশ্যই বিষয়ভিত্তিক।