সত্তা অবজেক্টগুলি ডেটা ট্রান্সফার অবজেক্ট হিসাবে ব্যবহার করা কি ভাল অনুশীলন?


29

আমি ভাবছি কারণ এটি যদি হয় তবে স্তরগুলির মধ্যে ডেটা স্থানান্তর করতে একই বৈশিষ্ট্য সহ একটি নতুন অবজেক্ট তৈরি করার জন্য সত্তা ফ্রেমওয়ার্ক কেন যুক্তি সরবরাহ করে না?

সত্তার কাঠামোর সাহায্যে উত্পন্ন সত্তা অবজেক্টগুলি আমি ব্যবহার করি।


3
আমি মনে করি এটি একটি ভাল প্রশ্ন তবে আমি সত্যিই বলতে পারছি না কারণ এটি পড়ার পক্ষে খুব কঠিন কারণ আমি কীভাবে এটি ঠিক করব তা নিশ্চিত নই। আপনার প্রশ্ন সম্পাদনা করুন।
candied_orange

1
@ ক্যান্ডিওড অরেঞ্জ +1 করেছে, এবং এটি এটিকে আরও ভয়ঙ্কর করে তুলেছে যে এটি এতগুলি উত্সাহ পেয়েছে।
guillaume31

উত্তর:


23

এটা আপনার উপরে।

বেশিরভাগ লোক আপনাকে বলবে যে এটি একটি ভাল অনুশীলন নয় তবে আপনি কিছু ক্ষেত্রে এটি থেকে দূরে সরে যেতে পারেন।

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 এর মধ্য দিয়ে যাওয়ার আগে এবং পরে আপনি এই জিনিসগুলি দিয়ে কী করবেন তা উদ্বেগের অংশ নয়। না হওয়া উচিত।


1
সংক্ষেপে সংক্ষেপে। ডিটিও এবং পোকোর মধ্যে পার্থক্য কী? তারা কি কেবল তথ্য রাখে না?
লাইভ

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

1
সুতরাং আপনি নিজের সার্বজনীন সংগ্রহের নামটি ব্যক্তিগত ক্ষেত্রের মতো করে রাখার পরিবর্তে আপনার সম্পূর্ণ ডোমেন মডেলটিকে রক্তাল্পতা তৈরি করতে চান? (আসুন কনস্ট্রাক্টরের সমস্যাটি একদিকে রেখে দিন, কারণ বেশিরভাগ ক্ষেত্রেই কোনও ক্ষেত্রের সমস্ত ক্ষেত্র গ্রহণকারী কোনও কনস্ট্রাক্টরকে প্রকাশ করা প্রথমত ডোমেনের বিরুদ্ধে থাকে ...)
গিল্লিউম 31

1
থেকে @Konrad এখানে : As of EF Core 2.1, only services known by EF Core can be injected. Support for injecting application services is being considered for a future release.আমি খুব পছন্দ করি আবেদন পরিষেবার আমার সত্ত্বা মধ্যে ইনজেকশনের আছে।
devnull

1
@ কনরাড আমি আমার ডোমেন সত্তাগুলি ডিটিও হিসাবে ব্যবহার বন্ধ করে দিয়েছি (যদি আমি তাদের এইভাবে ব্যবহার করতে পারি)। পরিষেবা ইনজেকশনটির জন্য ইএফের সমর্থন নির্বিশেষে ডিটিওগুলি কার্যকর।
ডিভনুল

8

না এটা না.

আদর্শভাবে, ডিটিওগুলি আপনার অধ্যবসায় সংগ্রহস্থলের সাথে মিলবে (ওরফে, আপনার ডাটাবেস সারণী)।

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

আরেকটি বিষয় হ'ল ডিটিওগুলি যে-যা দৃ pers়তার সাথে ডিল করে তার ডোমেনের অংশ, যখন আপনার ব্যবসায়ের স্তরটি তাদের সম্পর্কে কিছুই জানে না।


একটি কমান্ড অবজেক্ট একটি ডিটিও যা ব্যবসায়ের স্তর সম্পর্কে কিছু জানা উচিত।
ডেভনুল

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

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

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

4

এটি আসলে খুব খারাপ ধারণা। মার্টিন ফওলারের স্থানীয় ডিটিও সম্পর্কিত একটি নিবন্ধ রয়েছে ।

দীর্ঘ গল্প সংক্ষেপে, DTOপ্যাটার্নটি প্রক্রিয়াটির বাইরে ডেটা স্থানান্তর করার জন্য ব্যবহৃত হয়েছিল, উদাহরণস্বরূপ তারের উপর দিয়ে এবং একই প্রক্রিয়ার মধ্যে স্তরগুলির মধ্যে নয়।


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

4

না, এটি একটি খারাপ অভ্যাস।

কিছু কারণ:

  1. ডিফল্টরূপে নতুন সত্তা ক্ষেত্রগুলি ডিটিওতে থাকবে । সত্তাটি ব্যবহার করুন এর অর্থ হ'ল প্রতিটি তথ্য ডিফল্টরূপে গ্রাস করার জন্য উপলভ্য হবে। এটি আপনাকে বোধগম্য তথ্য প্রকাশের দিকে পরিচালিত করতে পারে বা কমপক্ষে, আপনার এপিআই চুক্তিকে স্ফীত করে দেয়, এমন অনেক তথ্য রয়েছে যা কে এপিআই গ্রহণ করে তার জন্য ব্যবহৃত হয় না। অবশ্যই, আপনি কিছু টীকাগুলি ( @JsonIgnoreজাভা বিশ্ব থেকে) ব্যবহার করে ক্ষেত্রগুলি উপেক্ষা করতে পারেন , তবে এটি পরবর্তী সমস্যার দিকে নিয়ে যায় ...
  2. সত্তার উপর প্রচুর টিকাশ / শর্তাদি / নিয়ন্ত্রণ । আপনাকে ডিটো-তে কী পাঠাতে চান তা নিয়ন্ত্রণ করতে হবে, যখন কিছু অ্যাট্রিবিউটের নাম পরিবর্তন করা হবে (এটি চুক্তিটি ভেঙে দেবে), সত্ত্বা থেকে নয় এমন কিছু বৈশিষ্ট্য যুক্ত করুন, বৈশিষ্ট্যের ক্রম ইত্যাদি, শীঘ্রই আপনি দেখতে পাবেন আপনার সাধারণ প্রচুর টিকা, অতিরিক্ত ক্ষেত্র এবং প্রতিটি সময় সহ সত্তা কী ঘটছে তা বোঝা শক্ত হবে।
  3. কম নমনীয়তা । একটি ডিটিও দিয়ে আপনি আরও ক্লাসে তথ্য ভাঙ্গতে পারবেন, গুণাবলীর নাম পরিবর্তন করতে, নতুন বৈশিষ্ট্য যুক্ত করতে পারেন ইত্যাদি। আপনি ডটো হিসাবে কোনও সত্তার সাথে এত সহজ করতে পারবেন না।
  4. অপ্টিমাইজড নয় । আপনার সত্তা সর্বদা একটি সাধারণ ডেটোর চেয়ে বড় হবে। সুতরাং আপনার কাছে সবসময় আরও তথ্য অবহেলিত / সিরিয়ালযুক্ত থাকতে হবে এবং সম্ভবত আরও অপ্রয়োজনীয় তথ্য প্রেরণ করা হবে।
  5. অলস সমস্যা । কিছু ফ্রেমওয়ার্কের সত্তা (যেমন হাইবারনেট) ব্যবহার করে আপনি যদি এমন কোনও তথ্য পুনরুদ্ধার করার চেষ্টা করেন যা আগে কোনও ডাটাবেজ লেনদেনের মধ্যে অলস বোঝা ছিল না, তবে ওআরএম প্রক্সি লেনদেনের সাথে সংযুক্ত হবে না এবং আপনি কিছু ধরণের "অলস ব্যতিক্রম" পাবেন getসত্তার একটি পদ্ধতি কল করতে ।

সুতরাং, এই কাজটিতে আপনাকে সহায়তা করার জন্য কোনও ডিটো-তে সত্তা ক্ষেত্রগুলি ম্যাপিং করা সহজ এবং নিরাপদ কোনও ধরণের ম্যাপার সরঞ্জাম ব্যবহার করুন।


1

@ ডেরিক যা বলেছিলেন তা পূরণ করতে, সত্তা অবজেক্টগুলিকে ডেটা স্থানান্তর অবজেক্ট হিসাবে ব্যবহারের প্রধান সমস্যাগুলি হ'ল:

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

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

  3. দৃশ্যমানতা এবং রক্ষণাবেক্ষণ: আপনাকে নিজের সত্তার ক্ষেত্রগুলিতে আপনার জেপিএ / হাইবারনেট টীকাগুলি পরিচালনা করতে হবে এবং একই জায়গায় জসনতে সিরিয়ালাইজ করার জন্য জ্যাকসন টীকাগুলি বজায় রাখতে হবে (এমনকি যদি আপনি তাদের উত্তরাধিকারসূত্রে প্রাপ্ত ইন্টারফেসে রাখার ক্ষেত্রে সত্তা বাস্তবায়ন থেকে আলাদা করতে পারেন তবেও সত্তা)। তারপরে, আপনি যদি কোনও নতুন ক্ষেত্র যুক্ত করার ক্ষেত্রে আপনার ডিটিও বিষয়বস্তু পরিবর্তন করেন তবে অন্য কোনও ব্যক্তি সম্ভবত এটি সত্তার ক্ষেত্র, এটি আপনার ডেটাবেজে সংশ্লিষ্ট টেবিলের ক্ষেত্রটি ভাবতে পারে (এমনকি আপনি যদি আপনার @Transientসমস্ত ডিটিও ক্ষেত্রে টীকা ব্যবহার করতে পারেন তবে মামলার জন্য ..!)।

আমার মতে, আপনি সত্তাটি পড়ার সময় শব্দটি তৈরি হয় তবে আমার মতামত অবশ্যই বিষয়ভিত্তিক।

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