কোনও এএসপি.এনইটি এমভিসি অ্যাপ্লিকেশনকে কী সরাসরি মডেল হিসাবে সত্তা ফ্রেমওয়ার্ক ব্যবহার করা উচিত?


22

আমি ভিজ্যুয়াল স্টুডিও 2013 (এমভিসি 5) এ আমার প্রথম এমভিসি অ্যাপ্লিকেশন তৈরি করছি এবং আমি আমার মডেলটি সেটআপ করার সর্বোত্তম উপায় সম্পর্কে কিছুটা অস্পষ্ট।

আমি বিদ্যমান ডাটাবেস থেকে কোড-প্রথম ব্যবহার করে একটি সত্তা ফ্রেমওয়ার্ক মডেল তৈরি করেছি। আমার প্রথম প্রবৃত্তিটি ছিল এমন কিছু মধ্যস্থতাকারী ক্লাস তৈরি করা যা দর্শনগুলি দ্বারা ব্যবহৃত মডেল হবে এবং সেই শ্রেণিগুলি সত্তা ফ্রেমওয়ার্ক ক্লাসগুলির সাথে কাজ করবে।

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

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



আপনি যদি কোড-ফার্স্ট ব্যবহার করে থাকেন, তবে কোন বিদ্যমান ডাটাবেস ছিল না, নেই?
আইজাক ক্লিনম্যান

1
EF 6.1+ এর সাহায্যে আপনি বিদ্যমান ডাটাবেস থেকে একটি কোড-প্রথম মডেল তৈরি করতে পারেন। এই এমএসডিএন নিবন্ধটি দেখুন: এমএসডিএন.মাইক্রোসফটকম /en-au/data/jj200620.aspx
মাইক D.

উত্তর:


23

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

  • উদাহরণ.এটিটিটিস - EF এর জন্য আমার সত্ত্বা এবং তাদের অ্যাক্সেসের জন্য ডিবি প্রসঙ্গ অন্তর্ভুক্ত করে।
  • উদাহরণ.মোডেলস - এমভিসি মডেলগুলি অন্তর্ভুক্ত করে।
  • উদাহরণ.ওয়েব - ওয়েব অ্যাপ্লিকেশন। উভয় উদাহরণ.ডোমেন এবং উদাহরণ.মোডেলগুলির উপর নির্ভর করে।

ডোমেন সত্তার মতো অন্যান্য অবজেক্টের রেফারেন্স রাখার পরিবর্তে এমভিসি মডেলগুলি আইডিগুলি পূর্ণসংখ্যা হিসাবে ধারণ করে।

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

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

public class PersonConverter
{
    public MyDatabaseContext _db;

    public PersonEntity Convert(PersonModel source)
    {
         PersonEntity destination = _db.People.Find(source.ID);

         if(destination == null)
             destination = new PersonEntity();

         destination.Name = source.Name;
         destination.Organisation = _db.Organisations.Find(source.OrganisationID);
         //etc

         return destination;
    }

    public PersonModel Convert(PersonEntity source)
    {
         PersonModel destination = new PersonModel()
         {
             Name = source.Name,
             OrganisationID = source.Organisation.ID,
             //etc
         };

         return destination;
    }
}

এই পদ্ধতিগুলি ব্যবহার করে আমি সদৃশটি বাইরে নিয়ে যা যা অন্যথায় প্রতিটি নিয়ামকের মধ্যে ঘটে। জেনেরিকের ব্যবহার জিনিসগুলিকে আরও নকল করতে পারে।

এভাবে কাজ করা একাধিক সুবিধা প্রদান করে:

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

উত্তম উত্তর, মানটি এক শ্রেণীর থেকে অন্য শ্রেণিতে ম্যানুয়ালি ম্যাপ করার পরিবর্তে ভ্যালুআইজেক্টর বা অনুরূপ কিছু (ব্যক্তিগতভাবে আমি অটোম্যাপারকে ঘৃণা করি) ব্যবহার করার পরামর্শ দেব।
রকলান

1
পৃথক উত্তর যুক্ত করার পরিবর্তে, আমি এখানে কেবল মন্তব্য করব যে ডিডিডি অনুশীলনে আপনার "রূপান্তরকারী" এবং দর্শনের জন্য পৃথক মডেলগুলি অ্যাপ্লিকেশন পরিষেবা স্তরটির অংশ হিসাবে বিবেচিত হবে। মূলত, অ্যাপ্লিকেশনটি থেকে সেই জটিলতাটি আড়াল করার সময় এটি আপনার ডোমেন মডেলটিকে প্রয়োজনীয়তা মতো জটিল হতে দেয়। এটি ডোমেন মডেল পরিবর্তনের কারণে অ্যাপ্লিকেশনটিকে পরিবর্তন করা থেকে রক্ষা করে। এএসএল অনুবাদটি পরিচালনা করে।
মাইকেল ব্রাউন 14

সুতরাং আপনি সেই মডেলের তথ্য পাওয়ার জন্য আপনার পার্সনমোডেলে (অর্থাত্ সংস্থাটি অবজেক্ট) প্রতিটি মডেলকে কল করবেন? বলুন যে ব্যক্তি এবং সংস্থার তথ্য আপডেট করার জন্য আপনার কাছে একটি ফর্ম রয়েছে, আপনি সংস্থাটি আপডেট করার সময় আপনার একটি অতিরিক্ত কল হবে? আমি সঞ্চিত প্রকটগুলি ব্যবহার করছি তাই আমি কী মডেলের সমস্ত বৈশিষ্ট্য এবং কোনও ধারণিত মডেলের বৈশিষ্ট্যগুলি একবারে পাঠাতে পারি না?
আলোকিত

1
আপনি কীভাবে কোনও সংগ্রহকে ম্যাপিং পরিচালনা করবেন? এটি EF6 তে আরও জটিল হয়ে উঠেছে বলে মনে হচ্ছে আপনি আপডেটের সাথে সত্ত্বার একটি নতুন তালিকা আর তৈরি করতে পারবেন না কারণ এটি সবকিছু পুনরায় তৈরি করে ...
জেরার্ড উইলকিনসন

2
আপনার নিজস্ব রূপান্তরকারী ক্লাস লেখার পরিবর্তে আমি অটোম্যাপার লাইব্রেরি ব্যবহার করার পরামর্শ দেব যা এই সমস্যার সমাধান করার জন্য লেখা হয়েছে। এটি 2014 থেকে অনেক পরিপক্ক হয়েছে!
বেনস্মিথ

6

আমি বলব এটি সত্যিই আপনার আবেদনের উপর নির্ভর করে। এটি কি কোনও ব্যবসার যুক্তি ছাড়াই খাঁটি CRUD করছে? তারপরে আমি সরাসরি আমার দৃষ্টিতে ইএফ মডেলগুলি ব্যবহার করব।

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

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

এছাড়াও মনে রাখবেন যে পুরো অ্যাপ্লিকেশনটির জন্য আপনাকে একটি কৌশল / প্যাটার্নে আটকে থাকার দরকার নেই, কিছু অঞ্চল খাঁটি সিআরইউডি হতে পারে এবং অন্যান্য অঞ্চলে প্রচুর ব্যবসায়ের যুক্তি থাকতে পারে ...

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