.NET এমভিসি প্রকল্পের আর্কিটেকচার / লেয়ারিং


11

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

"ব্যবসায়িক যুক্তি" কে কী হিসাবে সংজ্ঞায়িত করা যায় এবং ডেটা স্তরের সাথে ইন্টারেক্ট করার জন্য কীভাবে বোঝানো হয় তা নিয়ে আমি লড়াই করছি। উদাহরণস্বরূপ যানবাহন বিক্রির আবেদন গ্রহণ করা, ব্যবসায়ের যুক্তি কি এমন শ্রেণি হতে পারে যেগুলি প্রদত্ত যানবাহনের জন্য ট্যাক্স ব্যান্ড গণনা করা, প্রতি গ্যালন পরিসংখ্যানের প্রতি মাইল তুলনা ইত্যাদি কাজ করে? ব্যবসায়ের সত্তা হিসাবে (যেমন গাড়ি, ভ্যান, মোটর সাইকেল) আমি এগুলি আমার DataContextক্লাসের সাথে ডেটা স্তরে রাখি ।

এছাড়াও ব্যবসায়ের বিপরীতে অ্যাপ্লিকেশন যুক্তিটি কী গঠন করবে - আমি সেশন / ব্যবহারকারী ইনপুট বৈধতার মতো জিনিসগুলি অনুমান করছি?

সুতরাং উদাহরণস্বরূপ, কোনও গাড়ি নিয়ামক এমন কোনও ক্রিয়া / দর্শন ফলাফল দিতে পারে যা টাইপ করে এবং সেরা এমপিজি দ্বারা ফিল্টার করা সেরা দশটি গাড়ি তালিকাভুক্ত করে। সুতরাং আসুন আমি বলি যে ICarRepositoryআমার কন্ট্রোলারে একটি 'কারিপো' ইনজেকশন রয়েছে (রিপোজিটরি প্যাটার্ন / ডিআই ব্যবহার করে), আমি আমার গাড়িগুলি অ্যাকশন পদ্ধতির প্যারামিটার থেকে ফিল্টার করি egvar cars = carRepo.getCarsByType("hatchback");

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

আমি কি এখানে ভুল করছি? আমাদের কি এখনও রিপোজিটরি প্যাটার্ন ব্যবহার করা দরকার বা আমি কেবল একটি ইন্টারফেসের বিরুদ্ধে কোডটি ওআরএম এবং পরীক্ষা ডিকুয়াল করতে পারি? এই বিষয়টিতে, আমার কংক্রিটের ডেটা অ্যাক্সেস সংঘর্ষ (গুলি) dbcontext ডেটা স্তরে থাকাকালীন ইন্টারফেসের সংজ্ঞাগুলি ডোমেন / ব্যবসায়ের স্তরে যেতে হবে অর্থাত যদি ডেটা অ্যাক্সেস প্রযুক্তি পরিবর্তন করা হয় তবে আমার অন্যান্য স্তরগুলি প্রভাবিত হবে না?

আমি এখন পর্যন্ত যা পড়াশোনা করেছি তা থেকে আমার কাঠামোটি দেখতে এরকম দেখাচ্ছে:

এমভিসি ইন্টারনেট অ্যাপ্লিকেশন -> মানক ইন্টারনেট প্রকল্প - মডেলগুলি এখানে ভিউমোডেলস

ডোমেন / বিজনেস স্তর -> ব্যবসায়ের নির্দিষ্ট শ্রেণি / মডেল যা নিয়ামকরা প্রাসঙ্গিক দর্শনে যাওয়ার আগে ডেটা স্তর থেকে ডোমেন সত্তাগুলি প্রসেস করতে ব্যবহার করতে পারেন

সংগ্রহস্থল বিমূর্ততা প্রয়োজনীয়? -> আমি এ নিয়ে প্রচুর বিতর্ক শুনি, বিশেষত কোনও ওআরএম ব্যবহার করার সময়

ডেটা স্তর -> সত্তা শ্রেণি (গাড়ি, ভ্যান, মোটরসাইকেল), ডিবি কনটেক্সট - কংক্রিট ডেটা অ্যাক্সেস প্রযুক্তি স্তর

উত্তর:


26

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

উপস্থাপনা <---> ব্যবসায়িক লজিক <---> ডেটা অ্যাক্সেস

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

এমভিসি (উপস্থাপনা)

আপনার অ্যাপ্লিকেশনটিতে, এএসপি.এনইটি এমভিসি উপাদানটি ব্যবহারকারীর ইন্টারফেস (দৃশ্যগুলি) প্রদর্শন, এবং রাউটিং, প্রমাণীকরণ, অনুমোদন, অনুরোধের বৈধতা, প্রতিক্রিয়া হ্যান্ডলিং এবং এর মতো যোগাযোগের সমস্যাগুলির জন্য ব্যবসায়ের ডেটা রুপান্তরিত করতে হবে Mod পছন্দ (নিয়ন্ত্রণকারী) আপনার যদি কোড থাকে যা অন্য কিছু করে, তবে এটি এমভিসি উপাদানগুলির অন্তর্ভুক্ত নয়

সংগ্রহস্থল / ওআরএম (ডেটা অ্যাক্সেস)

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

ব্যবসায় যুক্তি

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

আপনার পদ্ধতির

এই জায়গাটি আপনার কাছে আমার জন্য কিছুটা ভেঙে যায়। আপনি আপনার এমভিসি নিয়ন্ত্রকটিকে সেই স্থান হিসাবে বর্ণনা করেন যেখানে আপনি সংগ্রহস্থল থেকে ডেটা পাবেন এবং এমপিজিক্যালকুলেটরকে কিছু কাজ করার আহ্বান জানিয়েছিলেন। আমার কন্ট্রোলারকে এগুলির কোনও কাজ করার দরকার নেই, তবে পরিবর্তে এই সমস্তটি একটি পরিষেবাতে অর্পণ করব would বিএলএলে।

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

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


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

@ মিশেলহর্পার হ্যাঁ, এটি এটিকে চালিয়ে যাওয়ার জন্য এক উত্তম উপায় বলে মনে হচ্ছে।
এরিক কিং

1
অথেনটিকেশন একটি নিয়ন্ত্রক উদ্বেগ হিসাবে রয়েছে (বিভিন্ন ইউআই বিভিন্নভাবে প্রমাণীকরণ করে) আমি বলব অনুমোদনটি ব্যবসায়ের যুক্তি এবং ব্যবসায় স্তরতে অন্তর্ভুক্ত। তুমি কি একমত?
টম

1
@ টম হ্যাঁ, আপনার একটি ভাল কথা রয়েছে। আমি সাধারণ অনুমোদনের কথা ভাবছিলাম যেহেতু এই রুটে ব্যবহারকারীর অ্যাক্সেস রয়েছে তবে এর চেয়ে আরও অনেক বেশি কিছু হতে পারে। "এতে আরও অনেক কিছু" অংশটি ব্যবসায় স্তরটিতে অন্তর্ভুক্ত।
এরিক কিং

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

0

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

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

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


জবাবের জন্য ধন্যবাদ উইলিয়াম 😊 আমি আমার ব্যবসায়িক বিষয়গুলি / যুক্তি এবং ডোমেন সত্তাকে 'মডেল' হিসাবে বিবেচনা করব যা নিয়ামক ব্যবহারকারীর ক্রিয়া এবং ভিউ মডেলগুলিকে নির্দিষ্ট মডেলগুলিতে দেখতে পারেন যা মডেলগুলির বিভিন্ন দল থাকতে পারে ইত্যাদি
মাইকেল হার্পার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.