এমভিসি + 3 স্তর; ভিউমোডেলস খেলায় আসে কোথায়?


11

আমি এএসপি.নেট এমভিসি ৪ ব্যবহার করে একটি 3-স্তরযুক্ত অ্যাপ্লিকেশন ডিজাইন করছি I আমি নিম্নলিখিত উত্সগুলিকে রেফারেন্স হিসাবে ব্যবহার করেছি।

আমি এখনও অবধি নিম্নলিখিত desingn আছে।

উপস্থাপনা লেয়ার (পিএল) (প্রধান MVC প্রকল্প, যেখানে এম এর MVC ডেটা অ্যাক্সেস লেয়ার সরিয়ে নেওয়া হয়েছে):

MyProjectName.Main
    Views/
    Controllers/
    ...

ব্যবসায় যুক্তিযুক্ত স্তর (বিএলএল) :

MyProjectName.BLL
    ViewModels/
    ProjectServices/
    ...

ডেটা অ্যাক্সেস লেয়ার (ডাল) :

MyProjectName.DAL
    Models/
    Repositories.EF/
    Repositories.Dapper/
    ...

এখন, পিএল বিএলএল এবং বিএলএল উল্লেখ ডালের রেফারেন্স করে। এই ভাবে নিম্ন স্তর তার উপরেরটির উপর নির্ভর করে না।

এই নকশায় পিএল বিএলএল একটি পরিষেবা প্রার্থনা করে। পিএল একটি ভিউ মডেলকে বিএলএলে পাস করতে পারে এবং বিএলএল একটি ভিউ মডেল পিএল-এ ফিরে যেতে পারে।

এছাড়াও, বিএলএল ডাল স্তরটি ডল করে এবং ডাল স্তর একটি মডেলকে বিএলএলে ফিরে আসতে পারে। বিএলএল পরিবর্তে একটি ভিউ মডেল তৈরি করতে এবং এটিকে পিএল এ ফিরিয়ে দিতে পারে।

এখন অবধি এই প্যাটার্নটি আমার পক্ষে কাজ করছিল। তবে, আমি এমন একটি সমস্যায় পড়েছি যেখানে আমার কিছু ভিউমোডেলগুলি বেশ কয়েকটি সত্তায় যোগদান করে। সাধারণ এমভিসি পদ্ধতির মধ্যে, নিয়ামকটিতে আমি joinএর পরে লিনকুই কোয়েরি ব্যবহার করি select new MyViewModel(){ ... }। তবে এখন, ডালেতে আমার ভিউমোডেলগুলি সংজ্ঞায়িত (বিএলএল) যেখানে অ্যাক্সেস নেই।

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

কোনও ধারণা কীভাবে আমি এই দ্বিধাটি সমাধান করতে পারি? ধন্যবাদ।

উত্তর:


18

প্রধান এমভিসি প্রকল্প, যেখানে এমভিসির এম ডেটা অ্যাক্সেস লেয়ারে স্থানান্তরিত হয়েছিল

সাধারণ ভ্রান্তি. Mএর MVCঅনেক উদাহরণ এবং টিউটোরিয়াল তাই দাবী করে যে সত্ত্বেও, ডাটা সঙ্গে কিছুই করার আছে।

M আপনার ভিউমোডেল এবং এটি আপনার এমভিসি প্রকল্পে থাকা উচিত। আপনার বিএলএলে আপনার যে ভিউমোডেলগুলি রয়েছে সেগুলি প্রকৃতপক্ষে ডেটা কন্ট্রাক্টস বা বিজনেসমোডেলস হিসাবে নামকরণ করা উচিত।

আপনার নিয়ামকের মধ্যে আপনার সাথে এর তুলনামূলক কিছু রয়েছে:

Get(id):
    dataContract = _service.Get(id);
    viewModel = Map(dataContract);
    return viewModel

আপনার পরিষেবাতে, এরকম কিছু:

Get(id):
    dataModel = _dataAccess.Get(id);
    dataContract = Map(dataModel);
    return dataContract;

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

GetWithBars():
    dataModels = _repository.Query("select from foos join bars");
    return dataModels;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.