কাকতালীয়ভাবে, আমি একটি উইনফর্মস প্রকল্পে কাজ করছি যা এমভিসির পরে নকশাকৃত। আমি এটিকে নিখুঁত উত্তর বলব না, তবে আমি আমার সামগ্রিক নকশাটি ব্যাখ্যা করব এবং আশা করি এটি আপনার নিজের সাথে আসতে সহায়তা করতে পারে।
এই প্রকল্পটি শুরুর আগে আমি যে পড়াটি করেছি তার উপর ভিত্তি করে, এটি বাস্তবায়নের কোনও "সঠিক" উপায় বলে মনে হচ্ছে না। আমি সাধারণ ওওপি এবং এমভিসি ডিজাইনের নীতিগুলি অনুসরণ করেছি এবং বাকীটি ট্রায়াল এবং ত্রুটি ছিল কারণ আমি একটি ওয়ার্কফ্লো তৈরি করেছি।
এমভিসি কি কেবল এই ব্যবহারের ক্ষেত্রে একটি অনুপযুক্ত আর্কিটেকচার?
না ..? আপনার সরাসরি উত্তর দেওয়ার জন্য আপনার প্রশ্নের পর্যাপ্ত প্রসঙ্গ নেই। আপনি কেন প্রথম স্থানে এমভিসি ব্যবহার করছেন? আপনার প্রকল্পের অ-কার্যকরী প্রয়োজনীয়তাগুলি কী কী? আপনার প্রকল্পটি কি খুব ইউআই ভারী হতে চলেছে? আপনি কি সুরক্ষা সম্পর্কে আরও যত্নশীল এবং বরং একটি স্তরযুক্ত আর্কিটেকচার চান? আপনার প্রকল্পের প্রধান উপাদানগুলি কী কী? সম্ভবত প্রতিটি উপাদান বিভিন্ন ডিজাইনের প্যাটার্ন প্রয়োজন। আপনি কেন এই নকশার ধরণটি প্রথম স্থানে ব্যবহার করতে চান তা সন্ধান করুন এবং আপনি নিজের প্রশ্নের উত্তর দিতে পারেন;)
এমভিসি ব্যবহারের জন্য আমার কারণ: এটি আমার মতে বোঝার জন্য এটি মোটামুটি সহজ ডিজাইনের প্যাটার্ন এবং আমার ডিজাইনটি ব্যবহারকারী ইন্টারঅ্যাকশনের উপর নির্ভরশীল। এমভিসি যেভাবে বিকাশকারীকে উদ্বেগগুলি আলাদা করতে দেয় তা আমার আবেদনের জন্যও যথেষ্ট। এটি আমার কোডকে অনেক বেশি রক্ষণাবেক্ষণযোগ্য এবং পরীক্ষামূলক করে তোলে ।
আমি আরও মনে করি যে আমি একটি হাইব্রিড ডিজাইন ব্যবহার করছি। সাধারণত, সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ে উপস্থাপিত আদর্শ ধারণাটি বাস্তবে অনুশীলন করে না। আপনি আপনার প্রকল্পের প্রয়োজন অনুসারে নকশাটি পরিবর্তন করতে পারেন। কোনটি সঠিক বা অন্যায় তা ধরা পড়ার দরকার নেই। সাধারণ অনুশীলন রয়েছে, তবে যতক্ষণ আপনি নিজেকে পায়ে গুলি না করেন ততক্ষণ নিয়মগুলি সর্বদা বাঁকানো বা ভেঙে যেতে পারে।
আমার বাস্তবায়নটি একটি উচ্চ স্তরের নকশা দিয়ে শুরু হয়েছিল যা আমাকে কী কী উপাদানগুলির প্রয়োজন তা সম্পর্কে ধারণা দিয়েছে। এই ভাবে শুরু করা এবং আর্কিটেকচারে আপনার পথে কাজ করা সবচেয়ে ভাল। প্রকল্পের প্যাকেজ চিত্রটি এখানে রয়েছে (স্টারআউএমএলে নির্মিত):
উপস্থাপনা স্তর ব্যতীত প্রতিটি একক স্তর মেসেজিং সিস্টেমের উপর নির্ভর করে লক্ষ্য করুন। এটি একটি সাধারণ "ভাষা" যা সেই স্তরগুলির নিম্ন স্তর এবং উপ-সিস্টেমগুলি একে অপরের সাথে যোগাযোগের জন্য ব্যবহার করে। আমার ক্ষেত্রে এটি সম্পাদন করা যায় এমন ক্রিয়াকলাপগুলির ভিত্তিতে একটি সাধারণ গণনা ছিল was যা আমাকে পরবর্তী পয়েন্টে নিয়ে আসে ...
আপনার প্রয়োগের ভিত্তি হিসাবে ক্রিয়াকলাপ বা আদেশগুলি ভাবেন। আপনি আপনার আবেদনটি কী করতে চান? এটি একেবারে মৌলিক ক্রিয়াকলাপগুলিতে ভেঙে দিন। উদাহরণস্বরূপ: ক্রিয়েটপ্রজেক্ট, রাইটনোটস, সেভপ্রজেক্ট, লোডপ্রজেক্ট ইত্যাদি U জিইআইআই (বা ফর্ম শ্রেণি) কিছু ঘটনা ঘটতে চলেছে (বোতাম টিপানোর মতো)। প্রতিটি ক্রিয়াকলাপ এর সাথে সম্পর্কিত একটি নিয়ামক পদ্ধতি রয়েছে। এই ক্ষেত্রে প্রস্থান মত খুব সহজ জিনিস। আবেদনটি কেবল ফর্ম শ্রেণি থেকে বন্ধ করা যেতে পারে। তবে ধরুন আমি প্রথমে কোনও ফাইলের কিছু অ্যাপ্লিকেশন ডেটা বজায় রাখতে চেয়েছিলাম? আমি আমার বোতাম টিপুন পদ্ধতিতে সংশ্লিষ্ট নিয়ামক শ্রেণীর কাছ থেকে "সংরক্ষণ করুন" পদ্ধতিটি কল করব।
সেখান থেকে, নিয়ামক পরিষেবা ক্লাসগুলি থেকে সঠিক ক্রিয়াকলাপ কল করবে। আমার অ্যাপ্লিকেশনটির পরিষেবা ক্লাসগুলি ডোমেন স্তরের ইন্টারফেস হিসাবে কাজ করে। তারা নিয়ামক পদ্ধতি কল থেকে প্রাপ্ত ইনপুটকে বৈধতা দেবে (এবং এইভাবে জিইউআই থেকে) এবং ডেটা মডেলটি ম্যানিপুলেট করবে ulate
একবার বৈধতা এবং সংশ্লিষ্ট অবজেক্ট ম্যানিপুলেশন সম্পূর্ণ হয়ে গেলে, পরিষেবা পদ্ধতিটি নিয়ামককে একটি বার্তা কোড ফেরত দেবে। উদাহরণস্বরূপ MessageCodes.SaveSuccess
,। নিয়ামক এবং পরিষেবা উভয় শ্রেণিই ডোমেন অবজেক্ট এবং / অথবা ক্রিয়াকলাপের সাধারণ সেটগুলির উপর ভিত্তি করে ছিল যাদের একসাথে গ্রুপ করা যায়।
উদাহরণস্বরূপ: FileMenuController
(অপারেশনস: নিউপ্রজেক্ট, সেভপ্রজেক্ট, লোডপ্রজেক্ট) -> ProjectServices
(ক্রিয়েটপ্রজেক্ট, পার্সিস্টপ্রজেক্টটফাইলে, লোডপ্রজেক্টফ্রোমফাইল)। Project
আপনার ডেটা মডেলটিতে একটি ডোমেন শ্রেণি কোথায় থাকবে। আমার ক্ষেত্রে কন্ট্রোলার এবং পরিষেবা ক্লাসগুলি অচল পদ্ধতিগুলির সাথে অস্থায়ী ক্লাস ছিল classes
তারপরে, নিয়ামক অপারেশনটিকে সাফল্যমুক্ত / সফলভাবে সমাপ্ত হিসাবে স্বীকৃতি দেয়। এখন, নিয়ামকের নিজস্ব মেসেজিং সিস্টেম রয়েছে যা এটি উপস্থাপনা স্তরটির সাথে ইন্টারঅ্যাক্ট করতে ব্যবহার করে, তাই পরিষেবা এবং উপস্থাপনা স্তরগুলির মধ্যে দ্বিগুণ নির্ভরতা। এই ক্ষেত্রে নামক একটি বর্গ ViewState
মধ্যে ViewModels
প্যাকেজ সবসময় নিয়ামক দ্বারা গুই ফিরিয়ে দেওয়া হয়। এই রাজ্যে এই জাতীয় তথ্য রয়েছে: " আপনি যে অ্যাপ্লিকেশনটিকে বৈধভাবে প্রয়োগ করার চেষ্টা করেছিলেন সেই রাজ্যটি কি? ", " আপনি যে অপারেশনটি সম্পাদন করার চেষ্টা করেছিলেন সে সম্পর্কে একটি মানব পাঠযোগ্য বার্তা এবং কেন এটি সফল ছিল না (ত্রুটি বার্তা) " এবং একটি ViewModel
শ্রেণি।
ViewModel
বর্গ ডোমেইন স্তর থেকে প্রাসঙ্গিক তথ্য যা গুই ভিউ আপডেট ব্যবহার করবে ধারণ করে। এই ভিউ মডেলগুলি ডোমেন ক্লাসগুলির মতো দেখায় তবে আমার ক্ষেত্রে আমি খুব চর্মসার বস্তু ব্যবহার করি । মূলত তাদের বেশ কিছু আচরণ নেই, কেবল অ্যাপ্লিকেশনটির নিম্ন স্তরের অবস্থা সম্পর্কে তথ্য রিলে করুন। অন্য কথায়, আমি উপস্থাপনা স্তরটিতে আমার ডোমেন ক্লাসগুলি দিতে যাচ্ছি না । এজন্যই Controllers
এবং Services
প্যাকেজগুলি পরিষেবা স্তরটিকে দুটি ভাগে বিভক্ত করে। কন্ট্রোলাররা কখনই ডোমেন ক্লাস পরিচালনা করতে বা তাদের রাষ্ট্রকে বৈধতা দেবে না। তারা কেবল পরিষেবাগুলি ব্যবহার করতে পারে এমন উপাত্ত প্রাসঙ্গিক ডেটাতে জিইউআই সম্পর্কিত সম্পর্কিত ডেটা রূপান্তরকারী হিসাবে একটি সীমানা হিসাবে কাজ করে vice নিয়ামকটিতে পরিষেবা যুক্তি অন্তর্ভুক্ত করা খুব চর্বি হতে পারে নিয়ন্ত্রণকারী, যা রক্ষণাবেক্ষণ করা শক্ত are
আমি আশা করি এটি আপনাকে একটি সূচনা পয়েন্ট দেয়।