RESTful API গুলি কী রক্তস্বল্প ডোমেন মডেলগুলিকে উত্সাহিত করে?


34

আমি এমন একটি প্রকল্পে কাজ করছি যেখানে আমরা পরিষেবা-ভিত্তিক আর্কিটেকচারে ডোমেন-চালিত নকশা এবং REST উভয়ই প্রয়োগ করার চেষ্টা করছি। আমরা প্রায় 100% আরএসটি কমপ্লায়েন্স নিয়ে চিন্তা করছি না; এটি সম্ভবত বলা ভাল যে আমরা রিসোর্স-ওরিয়েন্টেড এইচটিটিপি এপিআই (~ রিচার্ডসনের আরইএসটি পরিপক্কতার মডেলের স্তর 2 ) তৈরি করার চেষ্টা করছি। তা সত্ত্বেও, আমরা HTTP অনুরোধের আরপিসি-শৈলী ব্যবহার থেকে দূরে থাকতে চেষ্টা করছেন, অর্থাত আমরা বাস্তবায়ন করার প্রচেষ্টা আমাদের HTTP- র ক্রিয়া অনুযায়ী RFC2616 বরং ব্যবহার না করে POSTকরতে IsPostalAddressValid(...)উদাহরণস্বরূপ,।

যাইহোক, এর উপর জোর দেওয়া ডোমেন-চালিত ডিজাইন প্রয়োগের আমাদের প্রয়াসের ব্যয় বলে মনে হচ্ছে। শুধুমাত্র সঙ্গে GET, POST, PUT, DELETEএবং কয়েক অন্যান্য কদাচিৎ ব্যবহৃত পদ্ধতি, আমরা CRUDdy সেবা নির্মাণ ঝোঁক, এবং CRUDdy সেবা রক্তহীন ডোমেইন মডেল আছে ঝোঁক।

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

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


1
পোষ্টটি ইচ্ছাকৃতভাবে "ইচ্ছাকৃতভাবে অস্পষ্ট" হতে ডিজাইন করা হয়েছিল ; একটি পোস্টের ফলাফল বাস্তবায়ন-নির্দিষ্ট। টুইটার এবং অন্যান্য এপিআই ডিজাইনাররা আপনাকে কী করা থেকে বিরত রাখে এবং আপনার নির্দিষ্ট প্রয়োজনীয়তা অনুসারে আপনার API এর নন-সিআরইউডি অংশে প্রতিটি POST পদ্ধতি সংজ্ঞায়িত করে?
রবার্ট হার্ভে

@ রবার্টহারভে পোষ্টকে আমরা তৈরি হিসাবে তৈরি করেছি। এ খুঁজছি মান আবার, সম্ভবত যে মাত্রাতিরিক্ত সরল নয়। উদাহরণস্বরূপ, আপনি কি মনে করেন যে পোষ্টগুলি IsPostalAddressValid(...)"ডেটা-হ্যান্ডলিং প্রক্রিয়াতে কোনও ফর্ম জমা দেওয়ার ফলাফলের মতো ডেটা ব্লক সরবরাহ করা" এর সাথে খাপ খায়?
কাজার্ক

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

1
@ রবার্তাহারভে: আমি বিশ্বাস করি যে পোষ্ট এবং পুট / প্যাচ হ'ল আপনি যে ক্রিয়েট এবং আপডেটের ক্রিয়াটি চেয়েছিলেন তা কেবল। এটির নামটি কেবল আলাদাভাবে দেওয়া হয়েছে যাতে ক্রিয়াটি এখনও অ-RESTful ডিজাইনে কিছুটা বোধগম্য হয়।
মিথ্যা রায়ান

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

উত্তর:


38

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

REST এপিআই দুটি নিজস্ব অভ্যন্তরীণ মডেল থাকা দুটি ভিন্ন প্রসঙ্গকে পৃথক করে। প্রসঙ্গগুলি "অ্যানিমিক" অবজেক্টস (ডিটিও) ব্যবহার করে মোটা দানাদার ইন্টারফেসের (আরএসটি এপিআই) মাধ্যমে যোগাযোগ করে।

আপনার ক্ষেত্রে দেখে মনে হচ্ছে আপনি REST API এর একটি সীমানায় কোনও প্রসঙ্গ ছড়িয়ে দেওয়ার চেষ্টা করছেন। এটি সূক্ষ্ম-দানাযুক্ত দূরবর্তী ইন্টারফেস বা রক্তাল্প মডেল হতে পারে। আপনার প্রকল্পের উপর নির্ভর করে এটি সমস্যা হতে পারে বা নাও হতে পারে।


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

9

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

এটিকে অন্য উপায়ে বলতে গেলে আপনার প্রশ্নটি সমানভাবে উত্থাপিত হতে পারে "" কী 'স্মার্ট' অবজেক্টগুলি আরপিসি-স্টাইলের নকশাকে উত্সাহ দেয়? " এমনকি মার্টিন ফোলার (যিনি "অ্যানিমিক ডোমেন মডেল" শব্দটি তৈরি করেছিলেন) স্বীকার করেছেন যে ডিটিওর কিছুটা সুবিধা রয়েছে:

ডোমেন অবজেক্টের সাথে আচরণ করা স্থিরতা এবং উপস্থাপনার দায়বদ্ধতার মতো বিষয়গুলি থেকে ডোমেন যুক্তিকে আলাদা করার জন্য লেয়ারিং ব্যবহারের দৃ approach় পদ্ধতির বিরোধিতা করা উচিত নয়। ডোমেন অবজেক্টে থাকা যুক্তিটি হ'ল ডোমেন লজিক - বৈধতা, গণনা, ব্যবসায়ের নিয়ম - আপনি যা কল করতে পছন্দ করেন না কেন।

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

আরআরইএসটি হ'ল মেশিনের স্বাধীনতা সম্পর্কে; আপনি আপনার শেষ পয়েন্টগুলি সংস্থাগুলির প্রতিনিধিত্ব করতে চান এবং আপনার API এর গ্রাহকদের জন্য সেই সংস্থানগুলিকে সহজেই অ্যাক্সেস করতে এবং মানসম্পন্ন উপায়ে বজায় রাখতে সক্ষম হতে পারে এমন ডিগ্রিটিতে REST মডেলটি প্রয়োগ করুন। যদি তা রক্তশূন্য মনে হয়, তবে তাই হোন।

আরও দেখুন
আমার আরও ক্রিয়া প্রয়োজন


আমি মনে করি যে অবশ্যই প্রশ্নের আরএফসি 2616 দিকে সম্বোধন করে। আমরা কী রিসোর্স-ওরিয়েন্টেড হওয়ার চেষ্টা করছি, অর্থাৎ কমপক্ষে রিচার্ডসনের জন্য রিচার্ডসনের পরিপক্কতা মডেলটিতে মাত্রা 2 অর্জনের চেষ্টা করছি তার বিষয়ে কী বলা যায়?
কাজার্ক

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

4

REST এপিআই হ'ল এক ধরণের উপস্থাপনা স্তর। এটির ডোমেন মডেলটির সাথে কোনও সম্পর্ক নেই।

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

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

ডোমেন ← ORM → RDBMS
ডোমেন ← REST ম্যাপিং → REST এপিআই


3

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

সবার আগে আমি মনে করি ADMs এর প্রধান বৈশিষ্ট্য হ'ল তাদের মধ্যে কোনও আচরণ খুব কমই আছে। এটি বলার অপেক্ষা রাখে না যে সিস্টেমটির কোনও আচরণ নেই, কেবল এটি সাধারণত কোনও ধরণের পরিষেবা শ্রেণিতে থাকে (দেখুন http://vimeo.com/43598193 )।

এবং অবশ্যই যদি আচরণটি ADM তে বিদ্যমান না থাকে, তবে কী করে? অবশ্যই উত্তরটি ডেটা। এবং তাই এই মানচিত্রটি কীভাবে REST এপিআইতে যায়? সম্ভবত সংস্থানীয় সামগ্রীর ডেটা ম্যাপ এবং HTTP ক্রিয়াগুলিতে আচরণের মানচিত্র pres

একটি সমৃদ্ধ ডোমেন মডেল তৈরি করার জন্য আপনার যা দরকার তা আপনার কাছে রয়েছে, আপনাকে কেবল এইচটিটিপি ক্রিয়াকলাপগুলি কীভাবে ডেটাতে ডোমেন ক্রিয়াকলাপের মানচিত্র তৈরি করে তা দেখতে সক্ষম হতে হবে এবং তারপরে সেই ডেটাগুলিকে একই ক্লাসে রাখবে যা আপনার ডেটা আবদ্ধ করে।

আমি মনে করি যেখানে লোকেরা সমস্যাগুলির মধ্যে ঝুঁকতে থাকে তারা হ'ল এইচটিটিপি ক্রিয়াকলাপগুলি যখন তাদের ডোমেন আচরণে ম্যাপ করে তখন এটি দেখতে খুব অসুবিধা হয় যখন আচরণটি সাধারণ সিআরডির বাইরে থাকে, অর্থাত্ যখন ডোমেনের অন্য অংশগুলিতে পার্শ্ব প্রতিক্রিয়া থাকে এইচটিটিপি অনুরোধের মাধ্যমে সংস্থানটি সংশোধন করা হচ্ছে। এই সমস্যাটি সমাধান করার একটি উপায় হ'ল ডোমেন ইভেন্টগুলি ( http://www.udidahan.com/2009/06/14/domain-events-salLive/ )।


3

এই নিবন্ধটি বিষয়টির সাথে বেশ সম্পর্কিত এবং আপনার বিশ্বাসের প্রশ্নের উত্তর আমি বিশ্বাস করি।

আমি মনে করি যে একটি মূল ধারণাটি আপনার প্রশ্নের উত্তর খুব ভালভাবে দিয়েছে, তা নিবন্ধের নীচের অনুচ্ছেদে সংক্ষিপ্তসারিত:

"আরএসইপি এপিআইয়ের সংস্থান এবং একটি ডোমেন চালিত ডিজাইনে ডোমেন সত্তার মধ্যে পার্থক্য করা খুব গুরুত্বপূর্ণ Do ডোমেন চালিত ডিজাইন জিনিসগুলির বাস্তবায়নের দিকে প্রযোজ্য (এপিআই বাস্তবায়ন সহ) যখন আরএসটি এপিআইয়ের সংস্থানগুলি এপিআই নকশা এবং চুক্তি চালায়। এপিআই রিসোর্স নির্বাচন অন্তর্নিহিত ডোমেন প্রয়োগের বিশদগুলির উপর নির্ভর করে না ""


1

বেশ কয়েকটি যুক্তিসঙ্গতভাবে সফল বাস্তবায়ন আমি দেখেছি / নির্মিত উত্তরটির প্রশ্নের উত্তর তারা কীভাবে ক্রিয়াকলাপ + বিশেষ্য রূপকটি মিশ্রিত করায় এমন মোটা দানাযুক্ত 'ব্যবসায়িক বন্ধুত্বপূর্ণ' পদ্ধতি ব্যবহার করে যা মিশ্রণগুলিতে কাজ করে।

সুতরাং (ডুমড) getName()পদ্ধতি / পরিষেবার পরিবর্তে, উন্মুক্ত করে getPerson(), সনাক্তকারী-প্রকার / আইডি, পুরো Personসত্তা ফিরিয়ে দেওয়ার মতো জিনিসগুলিতে পাস করা ।

যেহেতু এই জাতীয় প্রসঙ্গে ব্যক্তি সত্তার আচরণগুলি পর্যাপ্ত পরিমাণে জানানো যায় না (তেমনি এটি কোনও তথ্যকেন্দ্রিক প্রসঙ্গেও হওয়া উচিত নয়), অনুরোধ / প্রতিক্রিয়া যুগলের জন্য কোনও তথ্য (বনাম অবজেক্ট) মডেলটি সংজ্ঞায়িত করা পুরোপুরি যুক্তিসঙ্গত is পরিষেবা / গুলি

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

আমি এমন লেখকদের সাথে একমত নই যে, উদাহরণস্বরূপ, একটি স্থানান্তর ক্রিয়া বাস্তবায়ন ব্যক্তি শ্রেণীর অন্তর্গত বা ব্যক্তিকেন্দ্রিক পরিষেবার সাথে যুক্ত। প্রকৃতপক্ষে, এর এবং বিকল্পগুলির জন্য স্থানান্তর করার পদ্ধতিটি Person(এই সাধারণ উদাহরণে) একটি দ্বারা আরও ভালভাবে সংজ্ঞায়িত করা হবে Carrier, যেখানে Personস্থানান্তর পদ্ধতিগুলি কীভাবে পাওয়া যায় বা কীভাবে স্থানান্তর এমনকি কীভাবে ঘটে তাও জানেন না (জেট ইঞ্জিনগুলি কীভাবে কাজ করে কে জানে যাহাই হউক না কেন)।

এটি কি Personসত্তাকে রক্তাল্পতা দেয়? আমি তাই মনে করি না.

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

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


ভাল পয়েন্ট --- এটি সত্যিই কিছু নতুন দৃষ্টিভঙ্গি এনেছে যা অন্য উত্তরগুলি এখনও দেয় নি।
কাজার্ক

0

আপনার সমস্যাটি কি আপনি যতটা সম্ভব POST ব্যবহার করে আপনার মডেলটিকে ক্রিয়াগুলির বেসিক সেটগুলিতে ছড়িয়ে দেওয়ার চেষ্টা করছেন?

এটি প্রয়োজনীয় নয় - আমি জানি যে বেশিরভাগ লোকের কাছেই বিশ্রামের অর্থ পোষ্ট, জিইটি, পুট এবং মুছে ফেলা হয় তবে http আরএফসি বলে:

HTTP / 1.1 এর জন্য সাধারণ পদ্ধতির সেটটি নীচে সংজ্ঞায়িত করা হয়েছে। যদিও এই সেটটি প্রসারিত করা যায়, পৃথকভাবে বর্ধিত ক্লায়েন্ট এবং সার্ভারগুলির জন্য একই পদ্ধতিগুলি ভাগ করার জন্য অতিরিক্ত পদ্ধতিগুলি ধরে নেওয়া যায় না।

এবং এসএমটিপি-র মতো সিস্টেমগুলি একই স্টাইলটি ক্রিয়া-ভিত্তিক পদ্ধতিগুলি ব্যবহার করে তবে সম্পূর্ণ ভিন্ন সেট সহ।

সুতরাং, আপনাকে এগুলি ব্যবহার করার কোনও কারণ নেই, আপনি পছন্দমতো ক্রিয়াকলাপগুলির যে কোনও সেট ব্যবহার করতে পারেন (যদিও সত্যই আপনি দেখতে পাবেন যে আপনি মৌলিক 4 তে আপনার যা কিছু প্রয়োজন তা কিছুটা চিন্তাভাবনা করে করতে পারেন)। অন্যান্য মেকানিজম থেকে REST কে স্বতন্ত্র করে তোলে তা হ'ল এই ক্রিয়াগুলি প্রয়োগের রাষ্ট্রহীন এবং ধারাবাহিক পদ্ধতি। আপনি স্তরগুলির মধ্যে মেসেজ পাসিং সিস্টেমটি কার্যকর করার চেষ্টা করবেন না কারণ আপনি মূলত তখন আরএসটি করছেন না, আপনি পরিবর্তে কোনও বার্তা-পাসিং, আরপিসি বা বার্তা-কাতারের প্রক্রিয়া করছেন যা নিঃসন্দেহে আপনাকে আরআরএসটির সুবিধা হারাবে (অর্থাত্ এর সরলতা যা এটি কোনও HTTP সংযোগের উপর সত্যই কার্যকরভাবে কাজ করে)।

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

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