REST এপিআই - ডিটিও বা না? [বন্ধ]


154

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

যাইহোক, আমি অতিরিক্ত অতিরিক্ত ম্যাপিং কোড, ডিটিও মডেলগুলি যা তাদের ডিটিও-কাউন্টার পার্টের সাথে 100% অভিন্ন হতে পারে তার সাথে ডিটিওগুলির ত্রুটিগুলিও বুঝতে পারি।

আমাদের এপিআই বেশিরভাগ তৈরি করা হয়েছে যাতে অন্যান্য ক্লায়েন্টরা ডেটা গ্রাস করতে পারে তবে আমরা যদি এটি সঠিকভাবে করি তবে আমরা যদি সম্ভব হয় তবে এটি আমাদের নিজস্ব ওয়েব জিইউআইয়ের জন্যও ব্যবহার করতে চাই।

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

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


9
এই প্রশ্নটি বন্ধ হয়ে গেলে অবাক হবেন না। এটি আরও একটি আলোচনা ভিত্তিক প্রশ্ন যার অর্থ পরিষ্কার কোনও সঠিক উত্তর নেই। বিভিন্ন লোককে জিজ্ঞাসা করুন এবং আপনি একটি আলাদা উত্তর পাবেন।
বেন থারলি


7
@ পিংকপ্যান্থার এটি একটি দুর্দান্ত নিবন্ধ এবং দুঃখের বিষয় এটি আর উপলভ্য নয়। এখানে ওয়েব সংরক্ষণাগার ক্যাশেড সংস্করণ
cassiomolin

উত্তর:


251

আপনার REST এপিআইতে আপনার ডিটিওগুলি কেন ব্যবহার করা উচিত

ডিটিও এর অর্থ ডি আটা টি ট্রান্সফার হে বজেক্ট

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

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

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


কেবল দৃ models়তা মডেলের পরিবর্তে ডিটিও প্রকাশের কয়েকটি সুবিধা উল্লেখ করতে হবে:

  • এপিআই মডেলগুলি থেকে দৃou়প্রত্যয়ী মডেলগুলি ou

  • DTOs যাবে উপযোগী আপনার প্রয়োজন এবং তারা মহান যখন শুধুমাত্র আপনার অধ্যবসায় সত্ত্বা গুণাবলীর একটি সেট প্রকাশক হয়। আপনার কোনও এ্যানোটেশন যেমন প্রয়োজন হবে না @XmlTransientএবং @JsonIgnoreকিছু বৈশিষ্ট্যের ক্রমিকায়ন এড়ানোর জন্য।

  • DTOs ব্যবহার করে, আপনি একটি এড়াতে হবে টীকা জাহান্নাম আপনার অধ্যবসায় সত্ত্বা, যে, আপনার অধ্যবসায় সত্ত্বা অ অধ্যবসায় সংশ্লিষ্ট টীকা সঙ্গে স্ফীত করা হবে না হবে।

  • কোনও উত্স তৈরি বা আপডেট করার সময় আপনি যে বৈশিষ্ট্যগুলি অর্জন করছেন তার উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ থাকবে ।

  • আপনি যদি সোয়াগার ব্যবহার করেন তবে আপনি আপনার অধ্যবসায়ের অস্তিত্বগুলিকে গোলমাল না করে আপনার এপিআই মডেলগুলি নথিভুক্ত করতে ব্যবহার করতে পারেন @ApiModelএবং @ApiModelPropertyটীকাগুলি ব্যবহার করতে পারেন ।

  • আপনার এপিআই এর প্রতিটি সংস্করণের জন্য আপনার আলাদা ডিটিও থাকতে পারে।

  • সম্পর্কের ম্যাপিংয়ের সময় আপনার আরও নমনীয়তা থাকবে।

  • বিভিন্ন মিডিয়া ধরণের জন্য আপনার বিভিন্ন ডিটিও থাকতে পারে।

  • আপনার ডিটিওগুলিতে হেটোয়াসের লিঙ্কগুলির একটি তালিকা থাকতে পারে । এই ধরণের জিনিস যা দৃ that়তা অবজেক্টগুলিতে যুক্ত করা উচিত নয়। স্প্রিং হেটোঅ্যাস ব্যবহার করার সময় , আপনি আপনার ডিটিও ক্লাসগুলি প্রসারিত করতে পারেন RepresentationModel(পূর্বে হিসাবে পরিচিত ResourceSupport) বা এগুলি মোড়ানো EntityModel(পূর্বে হিসাবে পরিচিত Resource<T>)।

বয়লারপ্লেট কোডটি দিয়ে কাজ করা

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

এছাড়াও আপনি বিবেচনা করতে পারেন Lombok জেনারেট করতে getters, setters, equals(), hashcode()এবং toString()আপনার জন্য পদ্ধতি।


সম্পর্কিত: আপনার ডিটিও ক্লাসগুলিতে আরও ভাল নাম দেওয়ার জন্য, এই উত্তরটি দেখুন


2
আমি যদি ডিটিও পথে চলে যাই, আপনি কি সমস্ত ডোমেন অবজেক্টগুলিকে একটি ডিটিওতে ম্যাপ করবেন বা কেবল যেগুলি অভিন্ন হবে না? এছাড়াও, আপনি কীভাবে বিভিন্ন পরিস্থিতি / প্রসঙ্গে ভিত্তিতে ডেটা প্রকাশের সমস্যাটি সমাধান করবেন? একাধিক ডিটিও প্রতি ডোমেন অবজেক্টে?
বেনজজো

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

2
@ মোলিন তথ্য এবং পরামর্শের জন্য অনেক ধন্যবাদ। আমি অবশ্যই ম্যাপস্ট্রাক্ট চেক আউট করব। এক নজরে এটি আমার প্রয়োজন অনুসারে খুব ভাল লাগছে।
বেনজজো

6
প্রিয় ডাউনভোটার, আপনি কি কমপক্ষে আপনার ডাউনটোটের কারণ ব্যাখ্যা করতে পারেন?
ক্যাসিওমোলিন

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

25

আপনার এপিআই সর্বজনীন হলে এবং আপনাকে একাধিক সংস্করণ সমর্থন করতে হবে, আপনাকে ডিটিও সহ যেতে হবে।

অন্যদিকে, যদি এটি প্রাইভেট এপিআই হয় এবং আপনি ক্লায়েন্ট এবং সার্ভার উভয়কেই নিয়ন্ত্রণ করেন তবে আমি ডিটিওগুলি এড়িয়ে চলে এবং সরাসরি ডোমেন মডেলটি প্রকাশ করি tend


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

11

আমি ডিটিও ব্যবহার করার প্রবণতা রাখি।

আমি ত্রুটিগুলি পছন্দ করি না তবে মনে হয় অন্যান্য বিকল্পগুলি আরও খারাপ:

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

অন্যদিকে ডিটিও পদ্ধতির অসুবিধাগুলি কম বয়লারপ্লেটের জন্য অবজেক্ট টু অবজেক্ট ম্যাপিং এবং লম্বোকের মতো জিনিসগুলির সাথে হ্রাস করা যেতে পারে ।


9

আপনি ইতিমধ্যে নিজেকে বলে রেখেছেন, এটি স্পষ্টতই একটি মতামত সম্পর্কিত প্রশ্ন। আমি নিজেই নো-ডিটিও পদ্ধতির প্রতি আরও আকৃষ্ট হয়েছি, কেবল আপনার সমস্ত বয়লারপ্লিট কোডের কারণে।

এটি একটি জসন / রেস্ট এপিআইয়ের প্রতিক্রিয়া পক্ষের জন্য মূলত সত্য। এমনকি আমি এই ক্ষেত্রে অনেক জেসন ভিউ / ফিল্টার না এড়াতে একটি জ্যাকসন অ্যাডন লিখেছিলাম: https://github.com/Antibrumm/jackson-antpathfilter

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


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