পৃথক প্রকল্পে এমভিসি সমাধানে ওয়েব এপিআই


88

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

আমি অনুমান করছি যে আমি আমার সমস্ত বৈশিষ্ট্য ইত্যাদি ওয়েব এপিআই এবং এমভিসি নিয়ন্ত্রকদের মধ্যে ভাগ করে নিতে পারি তাই এটি আমার পক্ষে বড় পরিবর্তন বলে মনে হয় না।

আমি যখন অ্যাপ্লিকেশনগুলি সেট আপ করছি, আমি প্রকল্পগুলিতে উপাদানগুলি বিভক্ত করতে চাই। আমার পরিকল্পনা ছিল একটি এমভিসি প্রকল্প এবং একটি ওয়েব এপিআই প্রকল্প হবে। তবে আমি ইস্যুতে ছুটে এসেছি। উদাহরণস্বরূপ আমি 2 টি অ্যাপ্লিকেশন যেমন শেষ করেছি, পৃথক রাউটিং সেট আপ ইত্যাদি with

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

উত্তর:


110

দুর্ভাগ্যক্রমে আপনি এটি সম্পর্কে ভুল - আমি অনুমান করছি যে আমি ওয়েব এপিআই এবং এমভিসি নিয়ন্ত্রকদের মধ্যে আমার সমস্ত বৈশিষ্ট্যগুলি ইত্যাদি ভাগ করে নিতে পারি তবে এটি আমার পক্ষে ব্যাপক পরিবর্তন বলে মনে হয় না।

ওয়েব এপিআই এবং এমভিসি দ্বারা ব্যবহৃত অনেকগুলি ধারণা, প্রথম নজরে একই রকম হলেও আসলে সামঞ্জস্যপূর্ণ নয়। উদাহরণস্বরূপ, ওয়েব এপিআই বৈশিষ্ট্যগুলি System.Web.Http.Filters.Filterএবং এমভিসি বৈশিষ্ট্যগুলি System.Web.Mvc.Filter- এবং সেগুলি বিনিময়যোগ্য নয়।

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

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

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

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


4
+1 দুর্দান্ত উত্তর। আমি ভেবেছিলাম প্রাথমিকভাবে এমভিসি এবং ওয়েবএপিআই উভয়ই কিছু কোড বিশেষত ফিল্টার, মডেল বাইন্ডিং ইত্যাদির মধ্যে ভাগ করে নিতে পারে তবে তারা সম্পূর্ণ আলাদা।
ভিজেআইএআই

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

9
আমি আশা করি তিনি আমাদের বর্তমান প্রকল্পটি ডিজাইন করার আগে আমার লিড এই পোস্টটি পড়ত।
বিল্ডার

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

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

27

আইএমও, সুরক্ষা এবং স্থাপনার আপনার সিদ্ধান্তটি চালিত করা উচিত। উদাহরণস্বরূপ, যদি আপনার এমভিসি অ্যাপ্লিকেশন ফর্ম প্রমাণীকরণ ব্যবহার করে তবে আপনি আপনার API এর জন্য বেসিক প্রমাণীকরণ (এসএসএল সহ) ব্যবহার করতে আগ্রহী, পৃথক প্রকল্পগুলি আপনার জীবনকে আরও সহজ করে তুলবে। আপনি যদি www.example.com এ আপনার সাইট হোস্ট করতে চান তবে আপনার API কে api.example.com (বনাম www.example.com/api) হিসাবে হোস্ট করতে চান, পৃথক প্রকল্পগুলি আপনার জীবনকে আরও সহজ করে তুলবে। যদি আপনি আপনার প্রকল্পগুলি পৃথক করে থাকেন এবং সে অনুযায়ী সেগুলি সাবডোমেন করেন এবং আপনি নিজের এমভিসি অ্যাপ্লিকেশন থেকে আপনার নিজস্ব এপিআই লাভ করতে চান, আপনার এপিআইতে ক্লায়েন্ট-সাইড কলগুলির জন্য কীভাবে একই উত্স নীতি ইস্যুটি মোকাবেলা করতে হবে তা খুঁজে বের করতে হবে । এই সাধারণ সমাধান লিভারেজ হয় jsonp বা CORS (বিশেষ আপনি যা করতে পারেন থাকেন)।

আপডেট (3/26/2013): অফিসিয়াল সিওআরএস সমর্থন আসছে: http://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%2020 %%20ASP.NET%20Web%20API


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

4
ব্যক্তিগতভাবে, আমি আপনার এপিআইয়ের জন্য আপনার ভিউ মডেলটি আপনার ডিটিও হিসাবে ব্যবহার করব না। আমি আশা করবো যে এই সিদ্ধান্তের ফলে আপনার ভিউ মডেল এবং এপিআই স্বাক্ষরগুলি ডাইভার্জ হওয়ার কারণে আপনি কিছুটা মারাত্মক ব্যথা ঘটাবেন। SoC ( en.wikedia.org/wiki/Sarama_of_concerns ) খুব গুরুত্বপূর্ণ।
ডেভিড পেডেন

@ ডেভিডপেডেন আপনি ওয়েবএপিআইয়ের জন্য একটি নতুন পৃথক প্রকল্প তৈরি করার পরামর্শ দিয়েছেন। এটা কি সত্যি? অন্যদিকে, আমি আমার অ্যাপ্লিকেশনটিতে ওয়েবএপিআইয়ের জন্য একটি নতুন পৃথক প্রকল্প তৈরি করব (বর্তমানে আমার কাছে একটি ইউআই লেয়ার (এমভিসি) এবং ডেটা স্তর (শ্রেণি পাঠাগার) রয়েছে have সুতরাং, আমি ডিআইও ব্যবহার করি, তবে আমি ভাবছি যে আমি যদি ব্যবহার করতে পারি) নতুন তৈরি ওয়েবএপিআই প্রকল্পের ডেটা লেয়ারে একই সত্ত্বা, সংগ্রহশালা, ইন্টারফেস এবং অ্যাবস্ট্রাক্ট ক্লাসগুলি এবং কেবলমাত্র আমাকে কেবল ওয়েবএপিআইআই কন্ট্রোলার তৈরি করতে হবে? বা আমি সেগুলিও তৈরি করব (সত্তা, সংগ্রহস্থল, ইন্টারফেস এবং বিমূর্তি) ক্লাস) আবার ওয়েবএপিআইয়ের জন্য? কোনও সহায়তা দয়া করে?
জ্যাক

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

9

কিছুটা অভিজ্ঞতার পরে (অ্যাপ্লিকেশনগুলির জন্য এবং এমভিসি জন্য এপিআই তৈরি করা)। আমি বেশিরভাগই উভয়ই করি।

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

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

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


4
আচ্ছা @ ডিমি, কিছু ভোট পাওয়ার জন্য এটি একটি অকেজো সম্পাদনা ... আমি কীভাবে এগুলি প্রত্যাখ্যান করতে পারি?
কুলারবাইটস

যা ইচ্ছে কর. আমি ভোট দিয়ে সম্পাদনা করি না তবে আমার মনে হয় এটির সর্বোত্তম চেহারা জন্য। এগিয়ে যান.
দিমিত্রিভাইকো

4
@ কুলারবাইটস আপনি সম্পাদনাগুলি প্রত্যাখ্যান করতে পারবেন না, তবে আপনি এটি আবার সম্পাদনা করতে এবং পরিবর্তনগুলি রোলব্যাক করতে পারেন। এটির জন্য 2,000 সমুদ্রের নীচে পিয়ার পর্যালোচনা প্রক্রিয়া প্রয়োজন, তবে এটি তাত্ক্ষণিকভাবে করার জন্য আপনার পর্যাপ্ত প্রতিনিধি রয়েছে। আমি সম্মত হই যে সম্পাদনাটির কোনও মূল্য যুক্ত হয়নি এবং এটি আপনার জন্য ফিরিয়ে আনা হয়েছে।
ড্যান বেচার্ড

6

সিম্পলইনজেক্টর (আইওসি ফ্রেমওয়ার্ক) থেকে স্টিভেন দুটি পৃথক প্রকল্পের পরামর্শ দিয়েছেন: ডিপেন্ডেন্সি রিসলভার.সেটরেসলভার এবং এইচটিটিপি কনফিগারেশন এর মধ্যে পার্থক্য কী Web ওয়েবএপিআই-এ নির্ভরতা রিসোলভার


5

আমি সম্প্রতি প্রায় একই কাজটি করেছি: আমি ভিএস ২০১২-তে ওয়েব এপিআই টেমপ্লেট নির্বাচন করে একটি নতুন এমভিসি 4 ওয়েব অ্যাপ্লিকেশন প্রকল্প দিয়ে শুরু করেছি।

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

আমি এপি কন্ট্রোলারদের একটি পৃথক শ্রেণির গ্রন্থাগার প্রকল্পে স্থানান্তরিত করতে চেয়েছিলাম। এটি মোটামুটি সহজ তবে সমাধানটি কিছুটা গোপন ছিল।

এমভিসি 4 প্রকল্পের এসেম্বলিআইএনফোতে কোডের অনুরূপ লাইন যুক্ত করুন

[assembly: PreApplicationStartMethod(typeof(LibraryRegistrator), "Register")]

এখন আপনার ক্লাসের লাইব্রেরি রেজিস্ট্রেটার দরকার (এটি নাম নির্বিশেষে বোধ করুন)

public class LibraryRegistrator
    {
        public static void Register()
        {
            BuildManager.AddReferencedAssembly(Assembly.LoadFrom(HostingEnvironment.MapPath("~/bin/yourown.dll")));
        }
    }

এমভিসি 4 প্রকল্পে এপিআই লাইব্রেরির উল্লেখও যুক্ত করুন।

এখন আপনি এপিআই কন্ট্রোলারগুলি আপনার নিজস্ব পৃথক শ্রেণির লাইব্রেরিতে (yourown.dll) যুক্ত করতে পারেন।


2

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

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


4
পৃথক প্রকল্প চাওয়ার জন্য আমার মূল যুক্তিটি হ'ল এপিআই সত্যই প্রথম প্রান্ত নয়। এটা মাঝারি স্তর।
লর্ডচিটো

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

0

ওয়েব.এপিআইয়ের জন্য পৃথক ডিএলএল সেটআপ করা ছাড়াও।

কেবল একটি পরামর্শ:

  1. প্রকল্প তৈরি করুন
  2. নাগেট ওয়েবএ্যাকটিভেটরেক্স
  3. অ্যাপ_স্টার্টের উপর আহ্বানের জন্য আ ক্লাস পদ্ধতি তৈরি করুন

    [সমাবেশ: ওয়েবঅ্যাক্টিভেটর এক্স.পোস্ট অ্যাপ্লিকেশন স্টার্টমেথোদ (টাইপফ (এপিআই। অ্যাপ্লিকেশন ওয়েবটিভেটর), "স্টার্ট")]

    [সমাবেশ: ওয়েবঅ্যাক্টিভেটর এক্স। অ্যাপ্লিকেশনশুটডাউন ম্যাথোড (টাইপফ (এপিআই। অ্যাপ্লিকেশন অ্যাক্টিভেটর), "শাটডাউন")]

  4. স্টার্ট পদ্ধতির ভিতরে একটি ওয়েব.াপি রুটগুলি নিবন্ধন করুন

    পাবলিক স্ট্যাটিক অকার্যকর স্টার্ট () {GlobalConfigration.Configure (WebApiConfig.Register); }

  5. প্রকল্পটি ওয়েব প্রকল্পে উল্লেখ করুন। শুরু পদ্ধতিটি সক্রিয় করতে।

আশাকরি এটা সাহায্য করবে.


0

আমি এপিআই নিয়ন্ত্রণকারীদের একটি নতুন প্রকল্পে বিভক্ত করার চেষ্টা করেছি। আমি যা করেছি তা হ'ল একটি নতুন লাইব্রেরি প্রকল্প তৈরি করা, এপিআই নামের ফোল্ডারের ভিতরে কন্ট্রোলারদের সরানো। তারপরে এমভিসি প্রকল্পে লাইব্রেরি প্রকল্পের রেফারেন্স যুক্ত করুন।

এমভিসি প্রকল্পে নিজেই ওয়েবএপিআই কনফিগারেশন বাকি রয়েছে। এটা ভাল কাজ করে।

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