কোনও পোস্ট পদক্ষেপে ডোমেন মডেলটিতে ফিরে দেখুন মডেলটি কীভাবে মানচিত্র করবেন?


87

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

আপনি কীভাবে এটি আপনার ডোমেন মডেলটিতে মানচিত্র করবেন?

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

অ্যাডেন্ডাম 1 (ফেব্রুয়ারী 2010 এর 9 তম): কখনও কখনও, মডেল এর সম্পত্তি বরাদ্দ করা যথেষ্ট নয়। ভিউ মডেলের মান অনুযায়ী ডোমেন মডেলের বিরুদ্ধে কিছু ব্যবস্থা নেওয়া উচিত। অর্থাত, ডোমেন মডেলটিতে কিছু পদ্ধতি কল করা উচিত। সম্ভবত, কোনও ধরণের অ্যাপ্লিকেশন পরিষেবা স্তর থাকা উচিত যা মডেলগুলি দেখার প্রক্রিয়া করার জন্য কন্ট্রোলার এবং ডোমেনের মধ্যে দাঁড়িয়ে থাকে ...


এই কোডটি কীভাবে সংগঠিত করবেন এবং নিম্নলিখিত লক্ষ্যগুলি অর্জনের জন্য এটি কোথায় রাখবেন?

  • নিয়ন্ত্রকগুলি পাতলা রাখুন
  • সম্মাননা এসসি অনুশীলন
  • ডোমেন-চালিত ডিজাইনের নীতিগুলি অনুসরণ করুন
  • DRY হতে
  • চলবে ...

উত্তর:


37

আমি একটি আইবিল্ডার ইন্টারফেস ব্যবহার করি এবং এটি ValueInjecter ব্যবহার করে প্রয়োগ করি

public interface IBuilder<TEntity, TViewModel>
{
      TEntity BuildEntity(TViewModel viewModel);
      TViewModel BuildViewModel(TEntity entity);
      TViewModel RebuildViewModel(TViewModel viewModel); 
}

... (বাস্তবায়ন) পুনর্নির্মাণ ভিউমোডেল কেবল কল করেBuildViewModel(BuilEntity(viewModel))

[HttpPost]
public ActionResult Update(ViewModel model)
{
   if(!ModelState.IsValid)
    {
       return View(builder.RebuildViewModel(model);
    }

   service.SaveOrUpdate(builder.BuildEntity(model));
   return RedirectToAction("Index");
}

বিটিডব্লু আমি ভিউমোডেল লিখি না আমি ইনপুট কিউজ লিখি এটি অনেক কম, তবে এটি সত্যিকারের গুরুত্বপূর্ণ
আশা নয় যে এটি সাহায্য করে

আপডেট: আমি এখন এই পদ্ধতিটি প্রোডিনার এএসপিএনভি এমভিসি ডেমো অ্যাপ্লিকেশনটিতে ব্যবহার করছি , একে এখন ইম্প্পার বলা হয়, এখানে একটি পিডিএফ সরবরাহ করা হয়েছে যেখানে এই পদ্ধতির বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে


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

@ ম্যাট মুরেল প্রোডিনারকোডেপ্লেক্স.কমের দিকে তাকান আমি সেখানে এটি করি এবং আমি সেখানে আইবিল্ডারের পরিবর্তে ইম্প্পার বলি
ওমু

6
আমি এই পদ্ধতির পছন্দ করি, আমি এর একটি নমুনা এখানে প্রয়োগ করেছি: gist.github.com/2379583
পল স্টোভেল

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

7

অটোম্যাপ্পারের মতো সরঞ্জামগুলি উত্স অবজেক্ট থেকে ডেটা সহ বিদ্যমান অবজেক্টটি আপডেট করতে ব্যবহার করা যেতে পারে। আপডেট করার জন্য কন্ট্রোলার অ্যাকশনটি দেখতে পারে:

[HttpPost]
public ActionResult Update(MyViewModel viewModel)
{
    MyDataModel dataModel = this.DataRepository.GetMyData(viewModel.Id);
    Mapper<MyViewModel, MyDataModel>(viewModel, dataModel);
    this.Repostitory.SaveMyData(dataModel);
    return View(viewModel);
}

উপরের স্নিপেটে যা দৃশ্যমান তা ছাড়াও:

  • মডেল + বৈধকরণ দেখতে পোস্টের তথ্য মডেলবাইন্ডারে করা হয় (কাস্টম বাইন্ডিংয়ের সাহায্যে এক্সটেন্ড করা যেতে পারে)
  • ত্রুটি হ্যান্ডলিং (অর্থাত্‍‍‍‍‍‍‍‍‍‍‌‍‍‍‍‍‍‍‍‍‍‍‍াইস‍েশা দ্বারা ডেটা অ্যাক্সেসের ব্যতিক্রম ছোঁড়া) [হ্যান্ডলিরর] ফিল্টার দ্বারা করা যেতে পারে

কন্ট্রোলার অ্যাকশনটি বেশ পাতলা এবং উদ্বেগগুলি পৃথক করা হয়: ম্যাপিংয়ের সমস্যাগুলি অটোম্যাপার কনফিগারেশনে সম্বোধন করা হয়, মডেলবাইন্ডার দ্বারা বৈধকরণ এবং সংগ্রহস্থল দ্বারা ডেটা অ্যাক্সেস করা হয়।


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

@ অ্যান্টন ভ্যালু ইন্জেক্টর চ্যাপ্টা উল্টাতে পারে;)
ওমু

এই পদ্ধতির সাহায্যে আপনি নিয়ামককে সরু রাখেন না, আপনি এসইসি এবং ডিআরওয়াই লঙ্ঘন করেন ... যেমন ওমু উল্লেখ করেছেন আপনার ম্যাপিং স্টাফগুলির যত্ন নেওয়ার জন্য একটি পৃথক স্তর থাকা উচিত।
রুকিয়ান

5

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

একটি ভিউমোডেল একটি ভিউ রেন্ডার করতে প্রয়োজনীয় সমস্ত তথ্য উপস্থাপন করে। এর মধ্যে স্ট্যাটিক অ-ইন্টারেক্টিভ জায়গাগুলিতে রেন্ডার করা ডেটা এবং ঠিক কী রেন্ডার করতে হবে তা ঠিক করার জন্য চেক করার জন্য বিশুদ্ধভাবে ডেটা অন্তর্ভুক্ত থাকতে পারে। একটি কন্ট্রোলার জিইটি অ্যাকশন সাধারণত তার ভিউর জন্য ভিউমডেল প্যাকেজিংয়ের জন্য দায়ী।

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

ওয়ান আইডিয়া

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

আর একটি আইডিয়া

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

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

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

তাই সম্ভবত সার্ভারের দিক থেকে এই জাতীয় কিছু উপলব্ধি হতে পারে:

public interface IUserAction<TModel>
{
     long ModelId { get; set; }
     IEnumerable<string> Validate(TModel model);
     void Complete(TModel model);
}

[Transaction] //just assuming some sort of 2-tier with transactions handled by filter
public ActionResult Save(IEnumerable<IUserAction<Employee>> actions)
{
     var errors = new List<string>();
     foreach( var action in actions ) 
     {
         // relying on ORM's identity map to prevent multiple database hits
         var employee = _employeeRepository.Get(action.ModelId);
         errors.AddRange(action.Validate(employee));
     }

     // handle error cases possibly rendering view with them

     foreach( var action in editModel.UserActions )
     {
         var employee = _employeeRepository.Get(action.ModelId);
         action.Complete(employee);
         // against relying on ORMs ability to properly generate SQL and batch changes
         _employeeRepository.Update(employee);
     }

     // render the success view
}

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

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

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


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

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

0

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

http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

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